小编MSM*_*MSM的帖子

分页性能,带有子查询、内连接和 where

我正在尝试优化以下查询(这是我能想到的最简化的版本):

SELECT tr.Id, StatusDate
FROM (
    SELECT tr.Id, tr.StatusDate
    FROM mon.ArchivedTaskResults_201504 as tr WITH (NOLOCK)
    INNER JOIN mon.ViewDevicesWithGroups dev WITH (NOLOCK) ON tr.DeviceId = dev.Id
    WHERE tr.ClientId = 4 AND dev.Deleted = 0
) AS tr        
ORDER BY StatusDate DESC
OFFSET 1000000 rows
FETCH NEXT 25 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

简单查询执行计划

问题是,查询性能与 OFFSET 成正比 - 对于 offset=0 查询在 0.0 秒内执行,但对于 offset=1000000 执行时间约为 23 秒(如果偏移量更大,则可能需要几分钟)。

我几乎可以肯定我的问题可以通过 ArchivedTaskResults 表上的适当聚集索引来解决,但是在尝试了几个小时之后我仍然没有找到好的索引。

ArchivedTaskResults 表真的很大,大约有 50000000 行(50 M)

附加信息:

如果有人能解决我上面描述的问题,我会非常高兴,但说实话,我的真实查询更加奇怪(免责声明:我不是设计这个数据库的人):

SELECT tr.Id, StatusDate
FROM (
    (
        SELECT tr.Id, StatusDate …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 query-performance

6
推荐指数
1
解决办法
3736
查看次数