小编Tom*_*Tom的帖子

Order By 导致对大表进行扫描

我有以下查询;

SELECT TOP 100 ID
FROM [dbo].[TableName] WITH (NOLOCK)
WHERE TypeId = 2
    AND DateTimeUTC < '2022-Aug-04 07:02:40'
    AND DateTimeUTC > '4/26/2022 7:36:36 AM'
ORDER BY ID ASC
Run Code Online (Sandbox Code Playgroud)

表 [dbo].[TableName](顺便说一句,不是它的真实名称)有超过 1.18 亿行。

我在此表上创建了以下索引;

CREATE INDEX [ix_TableName_DateTimeUTC_TypeId] 
ON [dbo].[TableName] (DateTimeUTC, TypeId)
    WITH FILLFACTOR = 90;
Run Code Online (Sandbox Code Playgroud)

如果我运行此查询(不包括ORDER BY),该查询会对上述索引执行 SEEK,并立即完成。然而,一旦我包含ORDER BY,查询就会在 PK 上执行 SCAN,读取所有 118+ 百万行。正如您可以想象的那样,这会降低性能并且查询需要很长时间才能完成。

解决此问题的最简单方法是完全删除该ORDER BY子句,但我认为这是不可能的,因为应用程序(进行此调用)要求按顺序返回数据。

关于如何改进这一点有什么建议吗?

sql-server index-tuning query-performance

14
推荐指数
4
解决办法
6021
查看次数