Разрешить Oracle преобразовывать связанные предикаты ИЛИ -в операции UNION ALL.

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 */:

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 для этого.

10
задан Lukas Eder 9 May 2012 в 07:46
поделиться