ROW_NUMBER () план выполнения - PullRequest
       4

ROW_NUMBER () план выполнения

4 голосов
/ 18 января 2012

Пожалуйста, рассмотрите этот запрос:

SELECT num,
   *
FROM   (
       SELECT OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate,
              ShippedDate,
              ROW_NUMBER() 
              OVER(ORDER BY OrderID) AS num
       FROM   Orders
   ) AS numbered
WHERE  NUM BETWEEN 0AND 100 

когда я выполняю этот запрос и получаю план выполнения, это выглядит так:

execution plan

Я хочу знать

1) Какие шаги SQL Server 2008 проходит для добавления ROW_NUMBER() в запрос?

2) Почему на первом шаге в плане выполнения у нас есть Clustered Index Scan?

3) Почему стоимость фильтрации составляет 2%? Я имею в виду, почему для получения соответствующих данных сервер SQL не выполняет сканирование таблицы? ROW_NUMBER() вызывает создание индекса?

Ответы [ 2 ]

2 голосов
/ 18 января 2012
  1. Части проекта «Сегмент / последовательность» плана связаны с использованием ROW_NUMBER ().

  2. У вас есть сканирование кластеризованного индекса, потому что ГДЕ нетв вашем внутреннем SELECT, следовательно, должны быть возвращены все строки таблицы.

  3. Фильтр относится к предложению WHERE во внешнем SELECT.

1 голос
/ 18 января 2012
  1. Эта часть запроса "Compute Scalar" является row_number, которая создается.
  2. Поскольку вы выбираете каждую строку из Orders, затем нумеруете ее, затем выбираете 1-100. Это сканирование таблицы (или, в данном случае, кластеризованного индекса), в любом случае вы его нарезаете.
  3. Нет, индексы не создаются на лету. Нужно проверить строки, потому что набор не возвращается упорядоченным в вашем подзапросе.
...