Как избежать расширения ИЛИ?

Как оптимизировать следующий запрос, если оператор ИЛИ используется в условии соединения, чтобы избежать расширения ИЛИ с точки зрения настройки SQL?

SELECT t1.A, t2.B, t1.C, t1.D, t2.E 
   FROM t1 LEFT JOIN t2
   ON t1.A=t2.A OR t1.B=t2.C;

person general46    schedule 12.03.2020    source источник
comment
В чем проблема с этим запросом? См. здесь минимум, который вы должны публиковать   -  person Marmite Bomber    schedule 22.04.2020
comment
Привет, вот, насколько я знаю, использование оператора ИЛИ не очень хорошо с точки зрения производительности. Поэтому я хотел узнать, как избежать расширения ИЛИ с точки зрения настройки SQL.   -  person general46    schedule 23.04.2020
comment
Какую версию Oracle вы используете? Здесь это актуально - проверьте select * from V$VERSION   -  person Marmite Bomber    schedule 23.04.2020
comment
Вы также должны научиться различать использование ИЛИ в предикате и расширение ИЛИ. Первое выполняется вами при написании запроса, второе выполняется Oracle Optimizer путем преобразования запроса с намерением помочь вам в случае, если предикат ИЛИ может вызвать проблемы с производительностью.   -  person Marmite Bomber    schedule 23.04.2020


Ответы (2)


Наличие условия ИЛИ игнорирует использование индексов. Итак, когда у вас есть следующие индексы -

t1 (A, B)
t2 (A, C)

Вы можете попробовать запрос ниже с предложением UNION ALL -

SELECT t1.A, t2.B, t1.C, t1.D, t2.E 
FROM t1 LEFT JOIN t2 ON t1.A=t2.A
UNION ALL
SELECT t1.A, t2.B, t1.C, t1.D, t2.E
FROM t1 LEFT JOIN t2 ON t1.B=t2.C;

Этот запрос будет использовать индекс и может выполняться быстрее.

person Ankit Bajpai    schedule 12.03.2020
comment
Условие ИЛИ игнорирует использование индексов - у вас есть источник для этого? - person juergen d; 12.03.2020
comment
Преобразование or в union - это «расширение ИЛИ», чего хотел избежать ОП. blogs.oracle.com/optimizer/ - person William Robertson; 12.03.2020
comment
очень грубое эмпирическое правило состоит в том, чтобы заменить Or на Union, чтобы избежать сканирования таблицы. - person Leketo; 13.03.2020
comment
Ну, какой бы ни была причина, ОП хочет этого избежать. - person William Robertson; 13.03.2020
comment
Ваш ответ дважды неверен. Сначала предлагаемый запрос возвращает другой результат (вместо UNION ALL следует использовать UNION). Во-вторых, индекс используется для доступа к небольшому количеству строк на основе предиката доступа, здесь все строки объединены, поэтому ни в одном из вариантов индекс не используется. (игнорируя вариант быстрого полного сканирования индекса). - person Marmite Bomber; 22.04.2020

Попробуйте это, так как вы выбираете результат в той же строке, все должно быть в порядке.

FROM
t1
LEFT JOIN t2 as AT1  ON t1.A=AT1.A 
LEFT JOIN t2 as AT2  ON  t1.B=AT2.C;
person subin ashok    schedule 12.03.2020