【发布时间】:2021-06-03 13:59:13
【问题描述】:
我有一个针对 SQL Server 数据库运行的查询需要 10 多秒才能执行。被查询的表有超过 1400 万行。
我想按日期顺序按给定的ServiceUserId 显示Notes 表中的Text 列。可能有数千个条目,所以我想将返回的值限制在可管理的水平。
SELECT Text
FROM
(SELECT
ROW_NUMBER() OVER (ORDER BY [DateDone]) AS RowNum, Text
FROM
Notes
WHERE
ServiceUserId = '6D33B91A-1C1D-4C99-998A-4A6B0CC0A6C2') AS RowConstrainedResult
WHERE
RowNum >= 40 AND RowNum < 60
ORDER BY
RowNum
以下是上述查询的执行计划。
- 非聚集索引 -
ServiceUserId和DateDone列上的非聚集索引按升序排列。 - 键查找 - 表的主键
NoteId
如果我第二次运行相同的查询但使用不同的行号,那么我会在毫秒内得到响应,我假设来自缓存的执行计划。为不同的ServiceUserId 运行的查询将需要大约 10 秒。
关于如何加快此查询的任何建议?
【问题讨论】:
-
像这样的后端分页没有太大意义,除非
DateDone是一个唯一值。好像不是这样,所以后端分页会返回不一致的结果。请包括一个独特的订购标准,可能会添加 PK。
标签: sql sql-server pagination query-optimization keyset-pagination