gpt4 book ai didi

sql - 为什么这个查询要进行全表扫描?

转载 作者:行者123 更新时间:2023-12-04 22:26:27 25 4
gpt4 key购买 nike

查询:

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 行和 3500 行的数据库上的计划
    tbl2 显示它正在对 tbl1 进行全表扫描。在我看来
    如果它可以在 tbl1 上进行索引查询,它应该会更快。

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

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

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

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

    最佳答案

    查看优化器的行计数估计会很有用,这些估计不在您发布的 SQL Developer 输出中。

    我注意到它正在执行的两个索引查找是 RANGE SCAN 而不是 UNIQUE SCAN。因此,它对返回的行数的估计很容易相去甚远(统计数据是否是最新的)。

    我的猜测是它对来自 TBL2 的 TABLE ACCESS 的最终行数的估计相当高,因此它认为它会在 TBL1 中找到大量匹​​配项,因此决定进行完整扫描/散列连接而不是嵌套循环/索引扫描。

    为了一些真正的乐趣,您可以在启用事件 10053 的情况下运行查询,并获取显示优化器执行的计算的跟踪。

    关于sql - 为什么这个查询要进行全表扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/592476/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com