当前位置:  开发笔记 > 编程语言 > 正文

为什么此查询执行全表扫描?

如何解决《为什么此查询执行全表扫描?》经验,为你挑选了1个好方法。

查询:

SELECT tbl1.*
   FROM tbl1 
JOIN tbl2
     ON (tbl1.t1_pk  = tbl2.t2_fk_t1_pk
AND tbl2.t2_strt_dt <= sysdate
AND tbl2.t2_end_dt  >= sysdate)
JOIN tbl3 on (tbl3.t3_pk = tbl2.t2_fk_t3_pk
AND tbl3.t3_lkup_1 = 2577304
AND tbl3.t3_lkup_2 = 1220833)
where tbl2.t2_lkup_1   = 1020000002981587;

事实:

Oracle XE

tbl1.t1_pk是主键.

tbl2.t2_fk_t1_pk是该t1_pk列上的外键.

tbl2.t2_lkup_1已编入索引.

tbl3.t3_pk是主键.

tbl2.t2_fk_t3_pk是该t3_pk列上的外键.

在tbl1中对11,000行和tbl2中的3500行的数据库进行解释计划表明它正在对tbl1进行全表扫描.在我看来,如果它可以在tbl1上进行索引查询,它应该更快.

在tbl1中对11,000行和tbl2中的3500行的数据库进行解释计划表明它正在对tbl1进行全表扫描.在我看来,如果它可以在tbl1上进行索引查询,它应该更快.

更新:我尝试了一些你建议的提示,解释成本变得更糟!现在我真的很困惑.

进一步更新:我终于可以访问生产数据库的副本,"解释计划"使用索引和低成本查询显示它.我想有更多的数据(在tbl1中超过100,000行,在tbl2中有50,000行)是让它决定索引是值得的.感谢所有帮助过的人.我仍然认为Oracle性能调优是一种黑色艺术,但我很高兴你们中的一些人理解它.

进一步更新:我已根据前雇主的要求更新了问题.他们不喜欢在谷歌查询中显示他们的表名.我应该知道的更好.



1> Jens Schaude..:

答案很简单:因为优化器需要更多的行来查找,所以它确实找到了.

检查统计数据,它们是最新的吗?检查解释计划中的预期基数是否与实际结果相符?如果不修复与该步骤相关的统计信息.

连接列的直方图可能会有所帮助.Oracle将使用这些来估计连接产生的基数.

当然,您始终可以通过提示强制使用索引

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有