我有一个带有Orders
(CLUSTERED IDENTITY PRIMARY KEY
)的表(OrderId
),我在过滤,并通过通过添加日期列(AddDate
)对数据进行排序。
有没有一种方法可以告诉查询优化器AddDate
的排序方式与OrderId
相同(因此,数据已经由AddDate
排序了)?
SQL Server确实不需要先扫描整个表然后对其进行排序。所有操作所需的是扫描表直到找到结束日期,然后在开始日期之前过滤掉数据并按原样返回(不进行排序)。
例子:
SELECT
*
FROM Orders
WHERE AddDate BETWEEN @FromDate AND @ToDate
ORDER BY AddDate
最佳答案
您可以在AddDate,OrderId上添加非聚集索引:
CREATE INDEX IX_Orders_AddDate_OrderID
ON dbo.Orders(AddDate, OrderID)
然后重写您的查询:
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
关于sql-server - 在行ID上的“聚集的身份”主键时排序并按添加日期进行过滤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52607636/