Порядок фильтрации для улучшения выполнения SQL-запроса

#sql

#sql

Вопрос:

У меня есть два запроса, служащих одной и той же цели.

 SELECT * FROM #user 
    INNER JOIN #department ON #user.departmentId = #department.departmentId
    INNER JOIN #user manager ON #department.departmentHead = manager.userid
WHERE #department.DepartmentName= 'QA'

SELECT * FROM #user 
    INNER JOIN #department ON #department.DepartmentName= 'QA' AND #user.departmentId = #department.departmentId 
    INNER JOIN #user manager ON #department.departmentHead = manager.userid
  

Структура таблицы выглядит следующим образом.

 create table #user
(
    userid int identity(1,1),
    userName varchar(20),
    departmentId int
)

create table #department
(
    departmentId int identity(1,1),
    departmentName varchar(50),
    departmentHead int
)
  

Я ожидаю некоторую разницу между двумя запросами с точки зрения производительности. Мое предположение / понимание заключается в том, что первый запрос выполняется в этом порядке.

  1. Объедините все записи таблиц user и department.

  2. Снова соедините результат шага 1 со всеми записями таблицы Users.

  3. Примените условие WHERE (Department = ‘QA’).

В то время как второй

  1. Объедините все записи отдела контроля качества (отфильтрованный набор) с таблицей users.

  2. Объедините результаты шага 1 со всеми записями пользовательской таблицы.

Я предполагаю, что второй запрос будет более эффективным, чем первый, поскольку второй запрос применяет фильтр на ранней стадии выполнения, позволяя подписчикам обрабатывать меньшее количество записей.

Но план выполнения SQL не показывает никакой разницы между двумя запросами. Пожалуйста, объясните это и подтвердите, правильно ли я понимаю порядок применения фильтра.

Ответ №1:

На самом деле SQL server располагает статистическими данными о ваших таблицах и может изменить порядок соединений, чтобы создать более оптимальный план выполнения.

Подсказка к запросу FORCE ORDER указывает, что порядок соединения, указанный синтаксисом запроса, сохраняется во время оптимизации запроса. Но не используйте это, если у вас нет проблем с производительностью.

Ответ №2:

Порядок операторов в SQL-запросах в значительной степени не имеет значения. Запрос компилируется полностью, а затем создается план выполнения на основе того, что считается наиболее вероятным способом выполнения запроса.