UNION
и UNION ALL
запросы могут превзойти эквивалентные запросы с использованием OR
-связанных предикатов при определенных обстоятельствах. Насколько мне известно, это частично связано с тем, что подселекты UNION
могут выполняться параллельно, и поэтому они могут иметь свой собственный "подплан", специфичный для каждой части предиката OR
-связанного, что, вероятно, намного более оптимально из-за упрощенные преобразования запросов.
Но запись 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 */
hint:
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.