我想咨询三个方面的性能(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评估?
答案 0 :(得分:1)
WITH
子句(或子查询因为它的所谓)只是为子查询创建别名的一种方法。当您在查询中拥有相同子查询的多个副本时,它最有用,在这种情况下,Oracle可能会或可能不会选择在幕后为其创建临时表(又名"实现"它)。你应该阅读这篇文章 - here's a good link。
回答你的问题:
1)如果可以使用索引(所涉及的列上没有函数,选择一小部分数据等),那么就可以使用它们,就像在任何其他查询中一样。
2)您无法向子查询添加索引。甚至不是Oracle可能在幕后创建的临时表;你无法控制它。
3)我建议您阅读有关何时可能使用或不使用索引的信息。试试http://www.orafaq.com/node/1403或http://www.orafaq.com/tuningguide/not%20using%20index.html,或者进行自己的谷歌搜索。
答案 1 :(得分:0)
WITH
子句可以是内联的,也可以是具体的。由Oracle决定哪种方法更好。在您的情况下,很可能两个查询都具有相同的执行计划(将内联)
PS:即使表格已实现,也无法添加索引,Oracle无法做到这一点。另一方面,在大多数情况下甚至不需要,表可以实现为哈希表(不是堆表)或者使用全表扫描。