UNION
在某些情况下,UNION ALL
查询可以胜过使用OR
-connected 谓词的等效查询。据我所知,这部分是因为UNION
子选择可以并行执行,因此它们可以有自己的“子计划”,特定于OR
-connected 谓词的每个部分,由于更简单的适用查询转换,这可能更加优化。
但是OR
,即使将子查询分解应用于UNION ALL
解决方案,编写连接的谓词通常也更具可读性和简洁性。我的问题是:有没有办法向 Oracle 表明,一个单一的、昂贵的OR
连接谓词应该转换为一个UNION ALL
操作?如果有这样的提示/方法,在什么情况下可以应用(例如,谓词所涉及的列上是否需要存在任何约束等)?一个例子:
CREATE TABLE a AS
SELECT 1 x, 2 y FROM DUAL UNION ALL
SELECT 2 x, 1 y FROM DUAL;
-- This query...
SELECT * FROM a
WHERE x = 1 OR y = 1
-- Is sometimes outperformed by this one, for more complex table sources...
-- Note: in my case, I can safely apply UNION ALL. I know the two predicates to
-- be mutually exclusive.
SELECT * FROM a
WHERE x = 1
UNION ALL
SELECT * FROM a
WHERE y = 1
请注意,我知道/*+ USE_CONCAT */
提示:
SELECT /*+ USE_CONCAT */ * FROM a
WHERE x = 1 OR y = 1
但它似乎并没有产生我需要UNION ALL
的东西(执行计划中没有强制操作):
-------------------------------------------
| Id | Operation | Name | E-Rows |
-------------------------------------------
| 0 | SELECT STATEMENT | | |
|* 1 | TABLE ACCESS FULL| A | 2 |
-------------------------------------------
也许,这个提示有一些限制?我为此提供了 Oracle 11g2。