数据库正经操作——两表关联join条件切勿使用or

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

数据库正经操作——两表关联join条件切勿使用or

项目中,需要找到36业务单据(100w条记录)对应的流程实例(全部流程实例数据量2000w)数据,执行了8个小时,未能结束执行,后面放弃了

简化的脚本(只包含一个单据)如下:

select a.frouteid,a.finstanceid 

from T_BF_INSTANCEENTRY a join T_AP_PAYABLEENTRY_pkid_delete b 

on  (a.fttablename='T_AP_PAYABLEENTRY' and a.ftid=b.FENTRYID) 

or  (a.FSTABLENAME='T_AP_PAYABLEENTRY' and a.FSID=b.FENTRYID) 

执行简化的脚本,3min中未能出结果,取消查询


修改为下面的脚本:

select a.frouteid,a.finstanceid 

from T_BF_INSTANCEENTRY a join T_AP_PAYABLEENTRY_pkid_delete b 

on  (a.fttablename='T_AP_PAYABLEENTRY' and a.ftid=b.FENTRYID)

union 

select a.frouteid,a.finstanceid 

from T_BF_INSTANCEENTRY a join T_AP_PAYABLEENTRY_pkid_delete b 

on  (a.FSTABLENAME='T_AP_PAYABLEENTRY' and a.FSID=b.FENTRYID) 

执行新脚本20s结束,返回结果11w行

查看执行计划,修改前的脚本使用嵌套循环连接(Nested Loop Join)而修改后则使用哈希匹配(Hash Join),对大量数据不需要排序的场景,哈希匹配有明显的性能优势。

下次写join条件可就要注意咯


强大的总结能力与实践能力!!!!!


学习

数据库正经操作——两表关联join条件切勿使用or

项目中,需要找到36业务单据(100w条记录)对应的流程实例(全部流程实例数据量2000w)数据,执行了8个小时,未能结束执行,后面放弃了简化的...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息