查询:
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;
事实:
- 甲骨文快捷版
- 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 性能调优是一门魔法,但我很高兴你们中的一些人理解它。
进一步更新:我应前雇主的要求更新了这个问题。他们不喜欢他们的表名出现在谷歌查询中。我应该知道的更好。