Joz*_*sky 5 sql-server sql-order-by clustered-index
我有一个Orders
带有CLUSTERED IDENTITY PRIMARY KEY
(OrderId
)的表(),并且正在通过添加日期列()对数据进行过滤和排序AddDate
。有没有一种方法可以告诉查询优化器,其AddDate
排序方式与OrderId
is 相同(因此数据AddDate
已经被排序)?
SQL Server确实不需要先扫描整个表然后对其进行排序。所有操作所需的是扫描表直到找到结束日期,然后在开始日期之前过滤掉数据并按原样返回(不进行排序)。
例:
SELECT
*
FROM Orders
WHERE AddDate BETWEEN @FromDate AND @ToDate
ORDER BY AddDate
Run Code Online (Sandbox Code Playgroud)
您可以在 AddDate、OrderId 上添加非聚集索引:
CREATE INDEX IX_Orders_AddDate_OrderID
ON dbo.Orders(AddDate, OrderID)
Run Code Online (Sandbox Code Playgroud)
然后重写您的查询:
SELECT *
FROM Orders
WHERE OrderId >=
(SELECT MIN(OrderId)
FROM dbo.Orders
WHERE AddDate >= @FromDate) AND
OrderId <=
(SELECT MAX(OrderId)
FROM dbo.Orders
WHERE AddDate <= @ToDate)
ORDER BY AddDate
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
198 次 |
最近记录: |