数据库正经操作——两表关联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
本文2024-09-16 18:42:01发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-23836.html