SQL union оптимизирован для левого соединения, быстрее, но Query Plan говорит, что затраты на ввод / вывод - PullRequest
1 голос
/ 08 февраля 2012
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 быстрее, но требует больше ресурсов? И если так, стоит ли мне выбирать более быстрый вариант?

1 Ответ

2 голосов
/ 08 февраля 2012

База данных будет выполнять некоторое внутреннее кэширование, поэтому время выполнения не всегда является лучшим показателем.Если вы выполняете первый запрос, а затем запускаете второй сразу после него, второй имеет несправедливое преимущество, поскольку некоторые данные, вероятно, будут кэшироваться.

Как и все вопросы по настройке базы данных, на самом деле ничего не задето.Мне лично нравится объединение, потому что я думаю, что оно немного более читабельно, но строго с точки зрения производительности, я бы провел некоторое расширенное тестирование в течение более длительного периода времени (чтобы минимизировать влияние кэширования) и посмотрел бы, как они работают.

Сколько данных в этих таблицах?У вас есть индексы для столбцов идентификаторов в четырех таблицах?Если нет, это ускорит ваш запрос при любых изменениях в sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...