Подтвердить что ты не робот

Каков порядок выполнения для этого оператора SQL

У меня ниже SQL Query,

SELECT TOP 5 C.CustomerID,C.CustomerName,C.CustomerSalary
FROM Customer C
WHERE C.CustomerSalary > 10000
ORDER BY C.CustomerSalary DESC

Каким будет порядок выполнения следующего с правильным объяснением,

  • TOP пункт
  • Предложение WHERE
  • ЗАКАЗ BY BY
4b9b3361

Ответ 1

Отметьте документацию для инструкции SELECT, в частности этот раздел:

Порядок логической обработки оператора SELECT

Следующие шаги показывают порядок логической обработки или привязку порядок, для оператора SELECT. Этот порядок определяет, когда объекты определенные на одном этапе, становятся доступными для предложений в последующих шаги. Например, если процессор запросов может связываться с (доступом) таблицы или представления, определенные в предложении FROM, эти объекты и их столбцы становятся доступными для всех последующих этапов. Наоборот, потому что предложение SELECT является шагом 8, любые псевдонимы столбцов или производные столбцы, определенные в этом разделе, не могут быть указаны предыдущими статьи. Однако они могут ссылаться на последующие статьи, такие как предложение ORDER BY. Обратите внимание, что фактическое физическое выполнение оператор определяется процессором запросов, и порядок может меняться из этого списка.

который дает следующий порядок:

FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP

Ответ 3

Это точный порядок выполнения с вашим случаем.

1-FROM
2-WHERE
3-SELECT 
4-ORDER BY
5-TOP

Ответ 4

TOP, WHERE и ORDER BY не выполняются - они просто описывают желаемый результат, а оптимизатор запросов к базе данных определяет (надеюсь) лучший план для фактического выполнения. Разделение между "объявлением желаемого результата" и его физическим достижением - это то, что делает SQL "декларативным" языком.

Предполагая, что есть индекс на CustomerSalary, а таблица не кластеризована, ваш запрос, скорее всего, будет выполняться как доступ к поиску индекса + таблицы, как показано на рисунке SQL Fiddle (нажмите "Просмотреть план выполнения" внизу):

enter image description here

Как вы можете видеть, сначала правильное значение CustomerSalary находится через Index Seek, тогда строка, значение которой принадлежит, извлекается из кучи таблицы через поиск RID (поиск идентификатора строки). Top только для показа здесь (и имеет 0% стоимости), как и вложенные петли в этом отношении - начальный индексный поиск вернет (не более) одну строку в любом случае. Весь запрос довольно эффективен и, вероятно, будет стоить всего несколько операций ввода-вывода.

Если таблица clustered, у вас скорее будет другой поиск индекса вместо доступа к куче таблицы, как показано в этом SQL Fiddle (обратите внимание на отсутствие ключевого слова NONCLUSTERED в DDL SQL):

enter image description here

Но будьте осторожны: на этот раз мне повезло, чтобы получить "правильный" план выполнения. Оптимизатор запросов мог бы выбрать полное сканирование таблицы, которое иногда происходит быстрее на небольших таблицах. При анализе планов запросов всегда старайтесь делать это на реальных объемах данных!

Ответ 5

Просто запомните эту фразу:   Фред Джонс "Странная могила имеет несколько тупых сов"

Возьмите первую букву каждого слова, и вы получите следующее: -

FROM
(ON)
JOIN
WHERE
GROUP BY
(WITH CUBE or WITH ROLLUP)
HAVING
SELECT
DISTINCT
ORDER BY
TOP

Надеюсь, что это поможет.

Ответ 6

Посетите https://msdn.microsoft.com/en-us/library/ms189499.aspx для лучшего объяснения.

Следующие шаги показывают порядок логической обработки или порядок привязки для оператора SELECT. Этот порядок определяет, когда объекты, определенные на одном шаге, становятся доступными для предложений на последующих шагах. Например, если процессор запросов может связывать (получать доступ) таблицы или представления, определенные в предложении FROM, эти объекты и их столбцы становятся доступными для всех последующих шагов. И наоборот, поскольку предложение SELECT является шагом 8, любые псевдонимы столбцов или производные столбцы, определенные в этом разделе, не могут ссылаться на предыдущие предложения. Однако на них могут ссылаться последующие предложения, такие как предложение ORDER BY. Обратите внимание, что фактическое физическое выполнение оператора определяется процессором запросов, и порядок может отличаться от этого списка.

С

ON

JOIN

WHERE

GROUP BY

С CUBE или WITH ROLLUP

HAVING

SELECT

DISTINCT

ORDER BY

TOP

Ответ 7

Мои $0,02 здесь.

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

  • Как MSSQL понял мой SQL-запрос?
  • Что он сделает, чтобы выполнить его наилучшим образом с учетом текущей схемы и данных?

На первый вопрос отвечает логический порядок выполнения. Брайан ответ показать, что это такое. Это то, как SQL понимает вашу команду: "Из таблицы Customer (с псевдонимом C) учитываются только строки WHERE C.CustomerSalary > 10000, ЗАКАЗАТЬ их BY C.CustomerSalary в потоке потомков и SELECT столбцы, перечисленные для TOP 5 строк". Результат будет соответствовать этому значению

Второй вопрос - это план выполнения запроса - и это зависит от вашей схемы (определения таблиц, выборочность данных, количество строк в таблице клиентов, определенные индексы и т.д.), поскольку сильно зависит от внутренней работы оптимизатора SQL Server,