ORACLE 收集多列统计信息的妙原创
3人赞赏了该文章
185次浏览
编辑于2020年12月31日 17:00:51
某个SQL的WHERE段里的条件,是用计算列做为过滤条件,如下:
FPICKEDQTY = ((FINCDEFECTRETURNQTY + FGOODRETURNQTY) + FPRCDEFECTRETURNQTY)
这是个复杂的过滤条件,正常情况下,优化器无法准确预估经过这条件后,返回正确的行数,
因此,在执行此语句时,优化器预估经过该条件后,只返回几行记录,因此选择了走圈套循环,
但在ORACLE11G,对这条件里的计算列 ((FINCDEFECTRETURNQTY + FGOODRETURNQTY) + FPRCDEFECTRETURNQTY)做多列统计信息采集后,再来测试执行计划,发现效果杠杠的。
测试效果显示,后者的执行计划,比前者减少了300万的逻辑块读,也就是,CPU 可以少算了大概
3000*8192M = 24G 字节的数据
FPICKEDQTY = ((FINCDEFECTRETURNQTY + FGOODRETURNQTY) + FPRCDEFECTRETURNQTY)
这是个复杂的过滤条件,正常情况下,优化器无法准确预估经过这条件后,返回正确的行数,
因此,在执行此语句时,优化器预估经过该条件后,只返回几行记录,因此选择了走圈套循环,
但在ORACLE11G,对这条件里的计算列 ((FINCDEFECTRETURNQTY + FGOODRETURNQTY) + FPRCDEFECTRETURNQTY)做多列统计信息采集后,再来测试执行计划,发现效果杠杠的。
测试效果显示,后者的执行计划,比前者减少了300万的逻辑块读,也就是,CPU 可以少算了大概
3000*8192M = 24G 字节的数据
多列统计信息采集的妙用.docx(955.74KB)
推荐阅读