Сообщение Re: Оптимизация: Where перед Union от 20.09.2018 10:00
Изменено 20.09.2018 10:10 Буравчик
Re: Оптимизация: Where перед Union
Здравствуйте, Буравчик, Вы писали:
Б>Не ожидал такого. Это нормально для оптимизатора БД не разобраться в этой ситуации?
Все не так просто (и, возможно, не так плохо).
Оказывается в опубликованном мною запрос оптимизатор все же смог разобраться.
Я просто слишком сильно упростил запрос, когда писал сообщение, и не проверил.
Т.е. вот так все же подхватываются индексы для обеих таблиц. Оптимизатор не так плох
Но стоит добавить одно (хитрое) поле, и все ломается.
Добавлено поле m2, существующее в одной таблице и не существующее в другой.
Индексы таблиц построены только по полю m (точнее по m и еще нескольким полям).
Поле m2 в индекс не входит, и, по идее, на результат влиять не должно.
Различия с предыдущим запросом выделены.
Причем для table1 применяется индекс, а для table2 — нет. Интересно...
Б>Не ожидал такого. Это нормально для оптимизатора БД не разобраться в этой ситуации?
Все не так просто (и, возможно, не так плохо).
Оказывается в опубликованном мною запрос оптимизатор все же смог разобраться.
Я просто слишком сильно упростил запрос, когда писал сообщение, и не проверил.
Т.е. вот так все же подхватываются индексы для обеих таблиц. Оптимизатор не так плох
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
Для table1 применяется индекс, а для table2 — нет. Интересно...
Б>Не ожидал такого. Это нормально для оптимизатора БД не разобраться в этой ситуации?
В общем, как-то влияет 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 — нет. Интересно...