ROW_NUMBER()执行计划

时间:2012-01-18 19:38:21

标签: sql sql-server performance sql-server-2008

请考虑此查询:

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 server不执行表扫描? ROW_NUMBER()会导致创建索引吗?

2 个答案:

答案 0 :(得分:2)

  1. 计划的细分/序列项目部分与ROW_NUMBER()的使用有关。

  2. 您有一个聚簇索引扫描,因为您的内部SELECT上没有WHERE子句,因此必须返回该表的所有行。

  3. Filter与外部SELECT上的WHERE子句相关。

答案 1 :(得分:1)

  1. 查询中的“Compute Scalar”部分是正在创建的row_number
  2. 因为您要从Orders中选择每一行,然后对其进行编号,然后选择1-100。这是一个表(或者在这种情况下是一个聚集索引)扫描,无论如何你切片它。
  3. 不,索引不是即时创建的。它必须检查行,因为该子集在子查询中没有按顺序排列。