达梦数据库归并连接

  关于达梦数据库的归并连接,其执行计划的关键字是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值