关于达梦数据库的归并连接,其执行计划的关键字是merge join。不免想研究下关于merge join的排序功能。
创建环境:
SQL> create table t1 as select * from dba_objects; Table created. SQL> create table t2 as select * from dba_segments; Table created. |
直接执行相关SQL,利用hints保证一定走的是merge join。
SQL> explain select /*+ use_merge(t1,t2) */ * from t1,t2 where t1.object_name=t2.segment_name; 1 #NSET2: [41553935, 690007, 1335] 2 #PRJT2: [41553935, 690007, 1335]; exp_num(40), is_atom(FALSE) 3 #SLCT2: [41553935, 690007, 1335]; T1.OBJECT_NAME = T2.SEGMENT_NAME 4 #NEST LOOP INNER JOIN2: [41553935, 690007, 1335]; 5 #CSCN2: [2, 11747, 597]; INDEX33561409(T1) 6 #CSCN2: [1, 5992, 738]; INDEX33561410(T2) |
归并连接的条件之一是两个表的连接列必须都建索引,如此看到hints失效了。
创建索引如下:
SQL> create index idx_t1_object_name on t1(object_name); 操作已执行 已用时间: 39.319(毫秒). 执行号:1600. SQL> create index idx_t2_segment_name on t2(segment_name); 操作已执行 已用时间: 21.281(毫秒). 执行号:1601. |
再次执行下看得到如下结果:
SQL> explain select /*+ use_merge(t1,t2) */ object_name from t1,t2 where t1.object_name=t2.segment_name; 1 #NSET2: [4, 702634, 96] 2 #PRJT2: [4, 702634, 96]; exp_num(1), is_atom(FALSE) 3 #MERGE INNER JOIN3: [4, 702634, 96]; KEY_NUM(1); KEY(COL_0 = COL_0) KEY_NULL_EQU(0) 4 #SSCN: [1, 11747, 48]; IDX_T1_OBJECT_NAME(T1) 5 #SSCN: [1, 5992, 48]; IDX_T2_SEGMENT_NAME(T2) 已用时间: 0.612(毫秒). 执行号:0. |
如此看到,确实走了merge join。但发生了sscn,即:发生了索引全扫描,但是在利用索引排序。但我们知道,索引就是有序的,所以很大程度上降低了语句的排序。
达梦数据库技术社区:https://eco.dameng.com