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.