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

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

Изменено 20.09.2018 10:10 Буравчик

Re: Оптимизация: Where перед Union
Здравствуйте, Буравчик, Вы писали:

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


Все не так просто (и, возможно, не так плохо).

Оказывается в опубликованном мною запрос оптимизатор все же смог разобраться.
Я просто слишком сильно упростил запрос, когда писал сообщение, и не проверил.

Т.е. вот так все же подхватываются индексы для обеих таблиц. Оптимизатор не так плох
SELECT table.m
FROM (
    SELECT m FROM table1 
    UNION 
    SELECT m FROM table2) AS table
WHERE table.m = :value;


Но стоит добавить одно (хитрое) поле, и все ломается.
Добавлено поле m2, существующее в одной таблице и не существующее в другой.
Индексы таблиц построены только по полю m (точнее по m и еще нескольким полям).
Поле m2 в индекс не входит, и, по идее, на результат влиять не должно.

Различия с предыдущим запросом выделены.
SELECT table.m 
FROM (
    SELECT m, NULL AS m2 FROM table1 
    UNION 
    SELECT m, m2 FROM table2) AS table
WHERE table.m = :value;


Причем для table1 применяется индекс, а для table2 — нет. Интересно...
Re: Оптимизация: Where перед Union
Здравствуйте, Буравчик, Вы писали:

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


В общем, как-то влияет NULL

SELECT table.m 
FROM (
    SELECT m, NULL AS m2 FROM table1 
    UNION 
    SELECT m, m2 FROM table2) AS table
WHERE table.m = :value;


Для table1 применяется индекс, а для table2 — нет. Интересно...