我们已将 SQL Server 更新到最新的 2022 版本,以期获得更好的性能,但即使是简单的查询,结果也相反。例如下面的查询在兼容性级别 100 下运行,仅进行 250 次逻辑读取,并在 10 毫秒内执行。如果我们将兼容性级别更改为 160 ,其读取次数将增加至 12000,持续时间将增加至 270 毫秒。
SELECT TOP 1 id, detail
FROM shopdetail WITH (NOLOCK)
WHERE id> 589530 AND detail <>''
ORDER BY id ASC
当我们检查执行计划时,它从索引查找更改为索引扫描。
有人可以帮助如何使优化器使用有效的计划而不是使用选项提示吗?
ID 列是主键,detail 列具有非聚集索引。
ALTER TABLE [dbo].[shopdetail] ADD CONSTRAINT [pk_shopdetailID] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
我建议您创建一个过滤索引。这意味着它只能扫描这一索引,该索引应该非常小或者根本没有行。