Оценка производительности SQL-запроса

В настоящее время у меня есть две версии 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;

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

Если вы не знаете, как читать план выполнения для MySQL, прочтите их. Это поможет вам лучше сравнить два запроса.

Shawn 16.10.2018 01:25

Лично я всегда избегаю вложенных коррелированных запросов в списке выбора, так как считаю его некрасивым и трудным для чтения. Я бы всегда использовал метод соединения, или то же самое с CTE, если вы в моде. Как говорит @Shawn, проверьте план выполнения. Я не удивлюсь, если они будут совершенно одинаковыми, и в этом случае удобочитаемость является ключевым моментом.

TomC 16.10.2018 01:57

Укажите каждый столбец в JOIN с таблицей, в которой он находится.

Rick James 16.10.2018 22:54

Какая у вас версия? Пожалуйста, предоставьте EXPLAIN SELECT ... в каждом случае.

Rick James 16.10.2018 22:58
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
165
1

Ответы 1

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

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

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

Другие вопросы по теме