当我的视图包含 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 使用索引?的主要内容,如果未能解决你的问题,请参考以下文章