Озадачен порядком обработки логических запросов Ициком Бен-Ганом в своей книге по SQL Server 2005 и книге по SQL Server 2008 - PullRequest
9 голосов
/ 17 июля 2010

В книге Внутри Microsoft SQL Server ™ 2005 T-SQL Querying , автор Ицик Бен-Ган сообщает нам порядок или логическая обработка SQL Server 2005:

(8)  SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1)  FROM <left_table>
(3)       <join_type> JOIN <right_table>
(2)       ON <join_condition>
(4)  WHERE <where_condition>
(5)  GROUP BY <group_by_list>
(6)  WITH {CUBE | ROLLUP}
(7)  HAVING <having_condition>
(10) ORDER BY <order_by_list>

1.  FROM
2.  ON
3.  OUTER (join)
4.  WHERE
5.  GROUP BY
6.  CUBE | ROLLUP
7.  HAVING
8.  SELECT
9.  DISTINCT
10. ORDER BY  <---------------------- NOTE
11. TOP       <---------------------- NOTE

В своей книге Внутри Microsoft SQL Server 2008: запросы T-SQL он сообщает нам следующий логический порядок обработки запросов:

(1) FROM
(1-J1) Cartesian Product
(1-J2) ON Filter
(1-J3) Add Outer Rows
(2) WHERE
(3) GROUP BY
(4) HAVING
(5) SELECT
(5-1) Evaluate Expressions
(5-2) DISTINCT
(5-3) TOP       <---------------------- NOTE
(6) ORDER BY    <---------------------- NOTE

Обратите внимание на порядок TOP и ORDER BY в верхних выдержках из этих книг.Они как раз напротив.Я думаю, что эти два шага очень важны и дадут совершенно другой результат в другом порядке.Я хочу знать, изменил ли SQL Server 2008 что-то в своем механизме хранения по сравнению с SQL Server 2005 или по какой-то другой причине, вызвавшей это?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 29 сентября 2011

Порядок логической обработки также задокументирован в этой записи Books Online .Будьте внимательны, чтобы отличить логический порядок обработки от физического порядка обработки.Как отмечает запись BOL:

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

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

5 голосов
/ 17 июля 2010

Проверьте это - это разоблачение по этому вопросу - и упоминается книга ИцикВторой порядок выше верен.

3 голосов
/ 17 марта 2015

В своем выпуске 2015 года T-SQL Querying Ицик Бен-Ган обновил обработку логического запроса в «СПИСОК 1-1 номера шагов логической обработки запроса» следующим образом:

(5) SELECT (5-2) DISTINCT (7) TOP(<top_specification>) (5-1) <select_list>
(1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate> 
       | (1-A) <left_table> <apply_type> APPLY <right_input_table> AS <alias> 
       | (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias> 
       | (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias> 
(2) WHERE <where_predicate> 
(3) GROUP BY <group_by_specification> 
(4) HAVING <having_predicate> 
(6) ORDER BY <order_by_list> 
(7) OFFSET <offset_specification> ROWS FETCH NEXT <fetch_specification> ROWS ONLY;

В отличие от предыдущей версии книги 2008 года, ORDER BY (шаг 6) теперь происходит до TOP (шаг 7).Конечно, как указано в другом месте, оба связаны.Как объясняет Ицик на 6 странице Запросы T-SQL :

[TOP] фильтрует указанное количество строк на основе порядка в предложении ORDER BY или на основе произвольногопорядок, если предложение ORDER BY отсутствует.С OFFSET-FETCH эта фаза пропускает указанное количество строк, а затем фильтрует следующее указанное количество строк на основе порядка в предложении ORDER BY.

Понимание вышеупомянутых шагов обработки логического запросаважно, потому что он объясняет иные неинтуитивные причуды в SQL.

Например, вы не можете использовать псевдоним из предложения SELECT (шаг 5-2) в предложении WHERE (шаг 2), потому что механизм выражений оценивает предложение WHERE передSELECT пункт.

-- This won't work!
SELECT Cost = Quantity * Price
FROM Orders
WHERE Cost > 500.00;

Как говорит Ицик в своей книге: «Фазы логической обработки запроса имеют определенный порядок. Напротив, оптимизатор часто может создавать ярлыки в физическом плане выполнения, который он генерирует.Конечно, он будет делать ярлыки, только если набор результатов гарантированно будет правильным. "

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