Оценка производительности SQL-запросов - PullRequest
0 голосов
/ 16 октября 2018

В настоящее время у меня есть две версии SQL-запроса, и я пытаюсь понять, какая из них может быть лучше с точки зрения производительности, стоимости и т. Д.

Это вопрос к этому вопросу: Средняя зарплата: Отделы VS Компания

select department_salary.pay_month, department_id,
case
  when department_avg>company_avg then 'higher'
  when department_avg<company_avg then 'lower'
  else 'same'
end as comparison
from
(
  select department_id,
         avg(amount) as department_avg,
         date_format(pay_date, '%Y-%m') as pay_month
      from salary
      join employee on salary.employee_id = employee.employee_id
      group by department_id, pay_month
) as department_salary
join
(
  select avg(amount) as company_avg,
         date_format(pay_date, '%Y-%m') as pay_month
      from salary
      group by date_format(pay_date, '%Y-%m')
) as company_salary
on department_salary.pay_month = company_salary.pay_month
;

Мой вопрос - вместо того, чтобы присоединиться, они могли бы вместо этого использовать вторую таблицу в самом операторе case.

select a.pay_month,
       a.department_id,
       (case when avg(a.salary) > (
             select avg(e.salary)
                 from employee e
                 where e.pay_month = a.pay_month)
        then 'higher'
        else 'lower' end) as comparison
from employee a
group by a.pay_month,a.department_id;

Что лучше?Действительно ли необходимо объединение?

1 Ответ

0 голосов
/ 16 октября 2018

Чтобы определить, что «лучше», вы должны проверить производительность.Иногда производительность с использованием коррелированных подзапросов намного лучше, чем у явной альтернативы join.

Когда вы спрашиваете: «Действительно ли объединение необходимо?»Я думаю, что вы имеете в виду «Действительно ли join необходимо».Очевидно, что иногда вы можете выразить запрос без явного join.Тем не менее, для выполнения этой работы база данных реализует алгоритм соединения (возможно, вложенный цикл или поиск по индексу).

Это в значительной степени отвечает на вопрос.SQL часто предоставляет несколько способов достижения одной и той же цели.Таким образом, вы можете часто выражать логику с join или без join.Только одна оговорка: коррелированный подзапрос действительно эквивалентен left join, а не inner join.

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