About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc
全部博文(169)
分类: Oracle
2020-06-11 09:17:31
1)改写后执行时间从2小时到8分钟,返回360w行+。虽然执行计划更复杂了,但是充分利用了HASH JOIN,MERGE JOIN这种大数据量处理算法代替原来的FILTER,更高效。如果不走OR扩展走什么?(走NESTED LOOPS,对IMS_NUM_INFO扫描从4次到1次,也很慢)
2)OR扩展存在缺点,大表还是多次被访问,还能继续优化吗?
追本溯源,从SQL含义出发,上面含义是ERR表的TMISID截取前8,9,10,11位与TMI_NO_INFOS.BILLID_HEAD匹配,对应匹配BILLID_HEAD长度正好为8,9,10,11。很显然,语义上可以这样改写:
ERR表与TMI_NO_INFOS表关联,ERR.TMISID前8位与ITMI_NO_INFOS.BILLID_HEAD长度在8-11之间的前8位完全匹配,在此前提下,TMISID like BILLID_HEAD||’%’。
现在就动手彻底改变多个OR子查询,让SQL更加精简,效率更高。
通过上一节的思路,改写SQL如下:
执行计划如下:
未完待续,见PART5: