我目前有这个查询(SQL Server):
DECLARE @PageNum int = 1;
DECLARE @PageSize int = 2;
SELECT *
FROM (
SELECT *,ROW_NUMBER() OVER(PARTITION BY Color ORDER BY Name) AS Row
FROM Orders
) t1
WHERE Row BETWEEN ((@PageNum-1)*@PageSize+1) AND (@PageNum*@PageSize)
ORDER BY Color,Name
这个查询的作用是选择"pages"每个Color
有2条记录。如果表包含:
<表类>Id 颜色 名称 tbody><<tr>1 红 纸# 1 2红 纸# 2 3 红 纸# 3 4绿色 纸# 4 5绿色 纸# 5 6绿色 纸# 6 7绿色 纸# 7 表类>
执行计划中的第一个操作是表扫描,所以我假设这是一个堆表(否则我们应该看到集群索引扫描),并且您创建的索引没有被使用。
而且,一旦这是一个永远不会改变的静态表,根据描述,碎片应该不是问题。
我没有在这台机器上安装SQL Server,所以我无法比较之前和之后的执行计划,但我相信,对于你的查询,我们可能会看到一些改进与聚集索引,排序键Martin Smith在他的评论中建议。
CREATE CLUSTERED INDEX IX_Order ON dbo.Order(OrderType ASC, From DESC)
请让我知道这是否改善了你的查询。如果没有,我可以创建一个类似的场景在白天进行测试。