当我的视图包含 UNION ALL 时,如何让 Oracle 使用索引?

Posted

技术标签:

【中文标题】当我的视图包含 UNION ALL 时,如何让 Oracle 使用索引?【英文标题】:How can I get Oracle to use indexes when my view contains a UNION ALL? 【发布时间】:2010-11-24 13:04:40 【问题描述】:

VIEW1 是:

SELECT A, B, C FROM view2
UNION ALL
SELECT A, B, C FROM view3
  INNER JOIN TBL5 ON view3.CODE = TBL5.CODE

列 C 在源表中被索引,当我单独执行任一选择语句时,它会使用索引并立即返回。当我使用视图时,它会超时。我的印象是,Oracle 重写了针对视图的查询并在有用的地方使用了索引,而不是执行 SELECT * FROM VIEW1 然后在事后应用谓词。

我做错了什么?上面的示例视图说明了这个问题,但我的真实视图每个都连接了几十个表,所以视图是非常必要的。

【问题讨论】:

“CODE”列是索引列吗?你说“C列”。附: asktom.oracle.com/pls/asktom/… @Tim:是的,CODE 也有索引。 view2、view3 和这个 UNION ALL 的第二部分都经过优化,可以很好地处理我的查询,但是当我查询这个视图本身时,事情就会崩溃。 我认为我们需要查看此查询的执行计划,以及分别执行的两个部分,以便提供任何真正有用的建议。 【参考方案1】:

优化器在构建执行计划时不知道 CODE 的值是什么,因为你违背了视图。如果您使用的是 11g,则可以使用 PUSH_PRED 优化器提示使其按预期工作。

【讨论】:

【参考方案2】:

您可以尝试提示。 或确保对表格进行分析。

另一个想法 - 也许制作一个计量化视图?

【讨论】:

以上是关于当我的视图包含 UNION ALL 时,如何让 Oracle 使用索引?的主要内容,如果未能解决你的问题,请参考以下文章

使用多个 UNION ALL 构建视图:有更好的方法吗?

union 与 union all 的表现

SAS PROC SQL UNION ALL - 最小化列长度

如何将 UNION ALL 查询的结果显示为链接?

SQL视图提示无法使用Union all求大神帮忙

使用Union All 和Order By In View?