Oracle性能问题,内部选择连接,临时WITH表索引

时间:2015-04-09 08:16:11

标签: sql oracle performance

我想咨询三个方面的性能(Oracle 11g)。

1. /如果我按关键字定义临时表" WITH"喜欢

WITH tbl AS (
    SELECT [columns from both tables...] 
    FROM table_with_inexes 
    JOIN other_table ...
)
SELECT ... 
FROM tbl
JOIN xxx ON tbl.column = xxx.column

是在该临时表上的后续选择能够使用在table_with_inexes和other_table上定义的索引吗?

2. /是否可以将索引添加到由" WITH"创建的临时表中。在上面那样的单个SQL命令?

3. /当我有这样的构造时:

...
LEFT JOIN (
     SELECT indexedColumn, otherColumns
     FROM table
     JOIN other_table
     GROUP BY ...
) C
ON (outerTable.indexedColumn = C.indexedColumn)

在哪种情况下Oracle可以在indexedColumn上使用索引?我假设,LEFT JOIN中的select只是"投影"不维护索引,所以在不使用索引的情况下评估联接的ON clausule评估?

2 个答案:

答案 0 :(得分:1)

WITH子句(或子查询因为它的所谓)只是为子查询创建别名的一种方法。当您在查询中拥有相同子查询的多个副本时,它最有用,在这种情况下,Oracle可能会或可能不会选择在幕后为其创建临时表(又名"实现"它)。你应该阅读这篇文章 - here's a good link

回答你的问题:

1)如果可以使用索引(所涉及的列上没有函数,选择一小部分数据等),那么就可以使用它们,就像在任何其他查询中一样。

2)您无法向子查询添加索引。甚至不是Oracle可能在幕后创建的临时表;你无法控制它。

3)我建议您阅读有关何时可能使用或不使用索引的信息。试试http://www.orafaq.com/node/1403http://www.orafaq.com/tuningguide/not%20using%20index.html,或者进行自己的谷歌搜索。

答案 1 :(得分:0)

WITH子句可以是内联的,也可以是具体的。由Oracle决定哪种方法更好。在您的情况下,很可能两个查询都具有相同的执行计划(将内联)

PS:即使表格已实现,也无法添加索引,Oracle无法做到这一点。另一方面,在大多数情况下甚至不需要,表可以实现为哈希表(不是堆表)或者使用全表扫描。