Информация об изменениях

Сообщение Оптимизация: Where перед Union от 19.09.2018 18:00

Изменено 19.09.2018 18:01 Буравчик

Оптимизация: Where перед Union
В таблицах TableA и TableB есть индексы по полю 'a'.
Mysql не смог оптимизировать такой запрос:

SELECT a, t
FROM (
    SELECT a, x as t FROM TableA
    UNION
    SELECT a, y as t FROM TableB)
WHERE a < :p1 AND a > :p2


Вроде ж понятно, что операцию лучше применить сначала к TableA и TableB (используя индексы), а потом уже делать UNION.

Если ему явно указать WHERE для каждой таблицы, то все работает быстро.
SELECT a, t
FROM (
    SELECT a, x as t FROM TableA WHERE a < :p1 AND a > :p2
    UNION
    SELECT a, y as t FROM TableB WHERE a < :p1 AND a > :p2)


Не ожидал такого. Это нормально для оптимизатора БД не разобраться в этой ситуации?
Оптимизация: Where перед Union
В таблицах TableA и TableB есть индексы по полю 'a'.
Mysql не смог оптимизировать такой запрос:

SELECT a, t
FROM (
    SELECT a, x as t FROM TableA
    UNION
    SELECT a, y as t FROM TableB)
WHERE a < :p1 AND a > :p2


Вроде ж понятно, что операцию WHERE лучше применить сначала к TableA и TableB (используя индексы), а потом уже делать UNION.

Если ему явно указать WHERE для каждой таблицы, то все работает быстро.
SELECT a, t
FROM (
    SELECT a, x as t FROM TableA WHERE a < :p1 AND a > :p2
    UNION
    SELECT a, y as t FROM TableB WHERE a < :p1 AND a > :p2)


Не ожидал такого. Это нормально для оптимизатора БД не разобраться в этой ситуации?