Как оптимизировать следующий запрос, если оператор ИЛИ используется в условии соединения, чтобы избежать расширения ИЛИ с точки зрения настройки 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;
Как оптимизировать следующий запрос, если оператор ИЛИ используется в условии соединения, чтобы избежать расширения ИЛИ с точки зрения настройки 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;
Наличие условия ИЛИ игнорирует использование индексов. Итак, когда у вас есть следующие индексы -
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;
Этот запрос будет использовать индекс и может выполняться быстрее.
or
в union
- это «расширение ИЛИ», чего хотел избежать ОП. blogs.oracle.com/optimizer/
- person William Robertson; 12.03.2020
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;
select * from V$VERSION
- person Marmite Bomber   schedule 23.04.2020