Sql Oracle性能问题、联接中的内部选择、临时表和索引

Sql Oracle性能问题、联接中的内部选择、临时表和索引,sql,oracle,performance,Sql,Oracle,Performance,我想讨论性能的三个方面(Oracle 11g) 1./如果我用关键字“WITH”定义临时表 该临时表上的后续select是否能够使用在带有_inexes的表_和其他_表上定义的索引 2./是否可以像单个SQL命令一样向上面的“WITH”创建的临时表添加索引 3./当我有这样的构造时: ... LEFT JOIN ( SELECT indexedColumn, otherColumns FROM table JOIN other_table GROUP BY

我想讨论性能的三个方面(Oracle 11g)

1./如果我用关键字“WITH”定义临时表

该临时表上的后续select是否能够使用在带有_inexes的表_和其他_表上定义的索引

2./是否可以像单个SQL命令一样向上面的“WITH”创建的临时表添加索引

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

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

在哪些情况下,Oracle可以在indexedColumn上使用索引?我假设select in LEFT联接只是不维护索引的“投影”,因此联接的ON子句求值是在不使用索引的情况下求值的?

WITH子句(或称为子查询分解)只是为子查询创建别名的一种方法。当查询中有同一子查询的多个副本时,它最有用,在这种情况下,Oracle可能会也可能不会选择在幕后为其创建临时表(也称为“物化”它)。你应该仔细阅读这个-

回答您的问题:

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

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


3) 我建议你仔细阅读一下什么时候可以使用索引,什么时候不可以使用索引。尝试或,或执行您自己的google搜索。

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


PS:即使表被物化,也不能添加索引,Oracle不能这样做。另一方面,在大多数情况下甚至不需要,可以将表具体化为哈希表(不是堆表)或对其使用全表扫描。

谢谢Boneist!我知道我需要深入了解Oracle,我只需要首先快速了解这一特定功能。我肯定会研究这些链接。如果能详细说明第三点,我将不胜感激。这与第1种情况相同吗?如果该内部select只从两个联接表的某个“关系”中选取列,而不应用任何函数,那么-Oracle能够对该列使用索引吗?(即,当它与两个表的某个连接组件一起工作时,“组件”是否保存原始表的索引?)。可选答案,请阅读链接:)@LalitKumarB:谢谢!我计划下一步研究类似的内容:)。为了完成这幅图:SQL标准中定义的
WITH
构造的正式名称是“公共表表达式”-“子查询分解”是Oracle使用的术语(可能是因为它在成为SQL标准的一部分之前就已经在Oracle中提供了——类似于窗口函数,也称为“分析函数”)@RomanNovotný>Oracle的优化器将使用索引,如果a)这是可能的,b)这样做是有意义的。索引的主要目的是使查找数据更容易/更快,类似于索引在书中的工作方式(例如,如果要查看一本书的全部或大部分页面,那么先查看索引是没有意义的)。
...
LEFT JOIN (
     SELECT indexedColumn, otherColumns
     FROM table
     JOIN other_table
     GROUP BY ...
) C
ON (outerTable.indexedColumn = C.indexedColumn)