如何判断在内联视图中推送会减慢查询速度?
问题描述:
我已经继承了一个有点混乱的查询,我正在重构为高性能。如何判断在内联视图中推送会减慢查询速度?
在这个过程中,由于个人喜好我所做的一件事是将“内连接”和“左外连接”语句中的所有ANSI-99连接语法都改为查询中的谓词。我注意到了两件非常奇怪的事情,我会感激解释。
- 更改“INNER JOIN ...”语法中的连接更改了解释计划。使用ANSI 99语法,oracle对正在连接的列进行全表扫描。在改变连接语法之后,它现在执行谓词推送。为什么连接语法会改变解释计划?
- 推进内联视图的谓词实际上减慢了查询的极大幅度。大约3秒后运行的查询(在更改连接之前)。现在它需要9秒。说实话,我对阅读解释计划相当陌生,所以完全有可能由于其他原因,查询的重组放慢了速度。但最终我的问题是:“索引列上的谓词推送是否有可能大大减慢查询速度?如果是这样,为什么?”
感谢您的答复,我的道歉,如果这是不是很清楚......
答
是否有可能推谓词索引列上如此大幅减慢查询?如果是这样,为什么?
当然可以。
通常,谓词推送使优化程序选择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
有选择性,则后者更有效,如果不是,则效率更低。
我的教育猜测是,这正是你的情况发生了什么。
如果您发布您的查询和执行计划,我可能会告诉更多。
+0
感谢您的解释。如果使用谓词推送,简单地改变连接的语法会改变吗? – jnt30 2009-06-25 18:13:42
请在发布之前和之后的查询中,您的更改可能不仅仅是“语法”更改 - 如果它们更改查询的含义(或添加/删除可用于优化器的信息)该计划相当大。 – 2009-06-26 01:52:04