查看: 6566|回复: 4

[精华] 达梦对于outer join 的优化 及其不足

[复制链接]
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2011-4-25 15:48 | 显示全部楼层 |阅读模式
达梦数据库对outer join做了优化处理:

SQL>explain select * from test_obj1 a left join test_obj2 s
2   on a.object_id=S.object_id
3   where s.object_name in ('N','TEST1');
explain select * from test_obj1 a left join test_obj2 s
on a.object_id=S.object_id
where s.object_name in ('N','TEST1');

#RSET:[304, 174, 2];
        #HCLP:[304, 174, 2];
                #CSEK(SECOND):[8, 4, 2]; I_TEST_OBJ2(TEST_OBJ2), INDEX_IN_SEARCH
                #CSEK:[170, 170, 13176]; INDEX33555491(TEST_OBJ1), FULL_SCAN
time used: 1.303(ms) clock tick:2653028.

右表的等于和in条件都能正确处理,使用了右表做驱动

SQL>create index i_test_obj1_1 on test_obj1(object_id);
create index i_test_obj1_1 on test_obj1(object_id);

time used: 615.980(ms) clock tick:1177526624.
SQL>explain select * from test_obj1 a left join test_obj2 s
2   on a.object_id=S.object_id
3   where s.object_name in ('N','TEST1');
explain select * from test_obj1 a left join test_obj2 s
on a.object_id=S.object_id
where s.object_name in ('N','TEST1');

#RSET:[9, 1, 2];
        #XNLP:[9, 1, 2]; CROSS_JOIN
                #CSEK(SECOND):[8, 4, 2]; I_TEST_OBJ2(TEST_OBJ2), INDEX_IN_SEARCH
                #CSEK(SECOND):[0, 0, 0]; i_test_obj1_1(TEST_OBJ1), INDEX_EQU_SEARCH
time used: 9.542(ms) clock tick:19527619.

左表关联字段的索引也能够正常使用


但是还存在不足:

达梦还是有些地方没有处理好

explain select * from test_obj1 a ,test_obj2 s,test_obj_s b
where a.object_id=S.object_id(+)
and s.object_id=b.object_id
;

#RSET:[487, 341, 11];
        #HCLP:[487, 341, 11];
                #CSEK:[2, 2, 11]; INDEX33555494(TEST_OBJ_S), FULL_SCAN
                #HCLP:[355, 339, 13176];
                        #CSEK:[170, 170, 13176]; INDEX33555491(TEST_OBJ1), FULL_SCAN
                        #CSEK:[169, 169, 13178]; INDEX33555492(TEST_OBJ2), FULL_SCAN
time used: 1.451(ms) clock tick:2959810.

left join下执行路径与oracle 9i差不多,而oracle在10G以后就都没问题了

理想的执行计划应该如下面的先访问小表test_obj_s然后利用object_id列的索引Nest loop join test_obj2表,再NLJ test_obj1

explain select * from test_obj1 a ,test_obj2 s,test_obj_s b
where a.object_id=S.object_id
and s.object_id=b.object_id;

#RSET:[4, 1, 11];
        #XFLT:[0, 0, 0]; EXPR18 = EXPR33
                #XNLP:[4, 1, 11]; CROSS_JOIN
                        #XNLP:[3, 1, 11]; CROSS_JOIN
                                #CSEK:[2, 2, 11]; INDEX33555494(TEST_OBJ_S), FULL_SCAN
                                #CSEK(SECOND):[0, 0, 0]; I_TEST_OBJ2_2(TEST_OBJ2), INDEX_EQU_SEARCH
                        #CSEK(SECOND):[0, 0, 0]; i_test_obj1_1(TEST_OBJ1), INDEX_EQU_SEARCH
time used: 2.141(ms) clock tick:4370581.


MYSQL里的null-rejected Conditions ,完全能被转换为inner join的:

explain select * from test_obj1 a , test_obj_s s
where  a.object_id=S.object_id(+)
and s.object_name is not null;

#RSET:[302, 172, 11];
        #XFLT:[0, 0, 0]; NOT(IS NULL(EXPR1 ))
                #HASH RIGHT JOIN[HRO]:[302, 172, 11];
                        #CSEK:[2, 2, 11]; INDEX33555494(TEST_OBJ_S), FULL_SCAN
                        #CSEK:[170, 170, 13176]; INDEX33555491(TEST_OBJ1), FULL_SCAN
time used: 0.522(ms) clock tick:1062118.

SQL>explain select * from test_obj1 a , test_obj_s s
2   where  a.object_id=S.object_id
3   and s.object_name is not null;
explain select * from test_obj1 a , test_obj_s s
where  a.object_id=S.object_id
and s.object_name is not null;

#RSET:[3, 1, 11];
        #XNLP:[3, 1, 11]; CROSS_JOIN
                #CSEK:[2, 2, 0]; INDEX33555494(TEST_OBJ_S), FULL_SCAN
                #CSEK(SECOND):[0, 0, 0]; i_test_obj1_1(TEST_OBJ1), INDEX_EQU_SEARCH
time used: 0.583(ms) clock tick:1185674.
SQL>
认证徽章
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
发表于 2011-4-25 18:02 | 显示全部楼层
很好的分析,我们会在新版本中继续改进,谢谢!

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2011-4-25 22:22 | 显示全部楼层
查询优化分析器是数据库的大脑阿

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2011-4-27 13:36 | 显示全部楼层
oracle是10g才能使用right table驱动的,逐步改进吧,达梦要抢先一步啊,人家有什么你有部分,人家没有的,你也没有,那是不行的

使用道具 举报

回复
认证徽章
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
发表于 2011-8-12 17:24 | 显示全部楼层
SQL>explain select * from test_obj1 a , test_obj_s s
2   where  a.object_id=S.object_id
3   and s.object_name is not null;
explain select * from test_obj1 a , test_obj_s s
where  a.object_id=S.object_id
and s.object_name is not null;

#NSET2: [104, 3622644, 0]
  #PRJT2: [104, 3622644, 0]; exp_num(28), is_atom(FALSE)
    #HASH2 INNER JOIN: [104, 3622644, 0]  KEY_NUM(1); 50702068
      #SLCT2: [50, 11851, 0]; NOT(TEST_OBJ_S.OBJECT_NAME IS NULL)
        #CSCN2: [50, 0, 0]; INDEX33555445(TEST_OBJ_S)
      #CSCN2: [50, 31187, 0]; INDEX33555443(TEST_OBJ1)
time used: 3.892(ms) clock tick:7951056. Execute id is 0.


dm7也转化成inner join了,速度比dm6快很多

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表