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