【问题标题】:Oracle performance questions, inner selects in joins, temporary WITH tables indexesOracle 性能问题、连接中的内部选择、临时 WITH 表索引
【发布时间】:2015-04-09 08:16:10
【问题描述】:

我想咨询三个方面的性能(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./ 是否可以在类似上面的单个SQL命令中为“WITH”创建的临时表添加索引?

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

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

Oracle 在哪些情况下可以在 indexedColumn 上使用索引?我假设,LEFT JOIN 中的选择只是不维护索引的“投影”,因此在不使用索引的情况下评估连接的 ON 子句评估?

【问题讨论】:

    标签: sql oracle performance


    【解决方案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,或执行您自己的谷歌搜索。

    【讨论】:

    • 感谢 Boneist!我知道我需要深入了解 Oracle,我只需要首先快速了解这些特定功能。我肯定会研究这些链接。我很感激对第三点的任何详细说明。这与1)的情况相同吗?如果该内部选择仅从两个连接表的某些“关系”中选择列,而不应用任何函数,那么 - Oracle 是否能够在该列上使用索引? (即,当它与两个表的某些连接程序集一起使用时,“程序集”是否保存原始表的索引?)。可选择回答,将阅读链接:)
    • @LalitKumarB:谢谢!我打算下一步研究这样的东西:)。
    • 补图:SQL标准中为WITH构造定义的官方名称是“公用表表达式”——“子查询分解”是Oracle使用的术语(可能是因为它可用在此之前在 Oracle 中是 SQL 标准的一部分 - 类似于窗口函数,也称为“分析函数”)
    • @RomanNovotný> 如果 a) 可以这样做并且 b) 这样做有意义,Oracle 的优化器将使用索引。索引的主要目的是使查找数据更容易/更快,类似于索引在书中的工作方式(例如,如果您要浏览一本书的所有或大部分页面,它不会首先查看索引是没有意义的)。
    【解决方案2】:

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

    PS:即使表物化了,也不能添加索引,Oracle 做不到。另一方面,在大多数情况下甚至没有必要,可以将表物化为哈希表(不是堆表)或对其进行全表扫描。

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2018-11-17
      • 2011-02-15
      • 2022-06-17
      • 2018-01-04
      • 1970-01-01
      • 2015-04-23
      • 2018-03-26
      • 1970-01-01
      相关资源
      最近更新 更多