我继承了一个有点混乱的查询,我正在努力重构以提高性能。
在此过程中,由于个人偏好而做的事情之一是将“内部联接”和“左外部联接”语句中的所有ANSI-99联接语法更改为查询中的谓词。我注意到两件非常奇怪的事情我会很感激。
感谢您的回复,如果不是很清楚我的道歉......
答案 0 :(得分:3)
谓词推送索引列是否有可能大大减慢查询速度?如果是这样,为什么?
当然可以。
通常,谓词推送会使优化器选择NESTED LOOPS
而不是HASH JOIN
。
如果条件不具有选择性,这可能会更慢。
此查询
SELECT *
FROM table1, t1
(
SELECT /*+ NO_PUSH_PRED */
*
FROM table2 t2
WHERE t2.col1 = :value1
) t2o
WHERE t2o.col2 = t1.col2
很可能会在table1
的内容上构建一个哈希表,并将针对此哈希表探测视图返回的行(反之亦然)。
此查询:
SELECT *
FROM table1, t1
(
SELECT /*+ PUSH_PRED */
*
FROM table2 t2
WHERE t2.col1 = :value1
) t2o
WHERE t2o.col2 = t1.col2
如果已定义,将使用NESTED LOOPS
和(t2.col1, t2.col2)
上的索引。
如果col2
对table2
具有选择性,后者效率更高,如果不是{{1}}则效率更低。
我有根据的猜测是,这正是你案件中发生的事情。
如果你发布你的查询和执行计划,我可能会告诉你更多。