请考虑此查询:
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
当我执行此查询并获得执行计划时,就像这样:
我想知道
1)SQL Server 2008传递哪些步骤来在查询中添加ROW_NUMBER()
?
2)为什么在执行计划的第一步中我们有Clustered Index Scan
?
3)为什么过滤成本为2%?我的意思是为什么获取适当的数据sql server不执行表扫描? ROW_NUMBER()
会导致创建索引吗?
答案 0 :(得分:2)
计划的细分/序列项目部分与ROW_NUMBER()的使用有关。
您有一个聚簇索引扫描,因为您的内部SELECT上没有WHERE子句,因此必须返回该表的所有行。
Filter与外部SELECT上的WHERE子句相关。
答案 1 :(得分:1)
row_number
。Orders
中选择每一行,然后对其进行编号,然后选择1-100。这是一个表(或者在这种情况下是一个聚集索引)扫描,无论如何你切片它。