select id, c.name as name
from a join b on a.id=b.id
join c on a.id=c.id
union
select id, d.name as name
from a join b on a.id=b.id
join d on a.id=d.id
оптимизировано до
select id,
case when c.name is not null or c.name <> '' then c.name
else d.name end as name
from a join b on a.id=b.id
left join c on a.id=c.id
left join d on a.id=d.id
where c.name is not null or d.name is not null
Время ответа на запрос увеличилось с 30 секунд до 13 секунд.
- sql union = 30 сек
- sql left join = 13secs
Однако после проверки плана запроса у sql union снижается стоимость ввода-вывода, см. Ниже:
- sql union = Общая оценочная стоимость операций ввода-вывода для ведомости 1 (в строке 1): 6277566.
- sql left join = Общая оценочная стоимость операций ввода-вывода для оператора 1 (в строке 1): 10481124.
Я использую Sybase 12.5 ASE, и план запроса был из DBArtisan 8.5; дайте мне знать, если мне нужно загрузить весь план запроса. Я еще не совсем знаком с планами запросов, но я делаю оптимизацию sql тут и там, обычно я просто основываюсь на улучшении времени. Также я проверил, что набор результатов одинаков для обоих запросов (27949 строк). Также я замаскировал и упростил имена таблиц.
Мой вопрос: означает ли это, что sql left join быстрее, но требует больше ресурсов? И если так, стоит ли мне выбирать более быстрый вариант?