SQL Server 2022 通过自动索引建议提升 SELECT 查询性能,需启用 CREATE_INDEX=ON 并满足高选择性(>0.001)、低更新率等条件,后台自动识别全表扫描和键查找并生成推荐索引。

SQL Server 2022 对 SELECT 查询的性能改进不是靠“新语法”或“魔法开关”,而是围绕执行计划生成、数据访问路径和运行时行为做了几处关键增强,其中多数对现有查询透明生效,但必须满足特定条件才能触发。
自动索引建议直接作用于 SELECT 查询
过去需要 DBA 手动分析 sys.dm_exec_query_stats 和执行计划才能发现缺失索引;现在 SQL Server 2022 的自动索引功能会在后台持续识别高频 SELECT 中的全表扫描(logical reads > 10000)和键查找(key lookup ratio > 50%),并自动生成推荐索引。
- 必须启用
CREATE_INDEX=ON(通过ALTER DATABASE ... SET AUTOMATIC_TUNING) - 推荐只对选择性高(
cardinality / total_rows > 0.001)、更新低频(日更新率 - 不会为
SELECT *或含TEXT/IMAGE列的查询创建索引——这类查询本身已触发警告
批模式执行在行存储表上默认启用
SQL Server 2019 引入了“行存储上的批模式”,但 2022 将其门槛大幅降低:只要查询满足内存充足 + CPU 核心数 ≥ 4 + 涉及行数 ≥ 300 行,即使没建列存储索引,也会尝试用批模式处理聚合、JOIN 和筛选操作。
- 对
GROUP BY、ORDER BY、TOP等常见SELECT子句有明显加速(尤其配合AVG/COUNT) - 若查询含
GETDATE()、NEWID()或标量 UDF,批模式会被禁用——这是最容易被忽略的失效点 - 可通过
SELECT ... OPTION(USE HINT('ENABLE_BATCH_MODE'))强制启用,但需确认统计信息已更新(UPDATE STATISTICS)
查询存储提示替代计划指南,更轻量干预 SELECT 计划
当某个 SELECT 查询因参数嗅探或统计偏差反复生成次优计划时,不再需要写冗长的 sp_create_plan_guide;SQL Server 2022 支持直接在查询存储中绑定提示:
- 执行一次慢查询后,在
sys.query_store_plan中定位其plan_id - 用
sys.sp_query_store_force_plan @query_id, @plan_id锁定好计划 - 也可用
OPTION(RECOMPILE)或OPTION(USE PLAN N'...')作为提示注入,无需改应用代码 - 注意:如果底层表结构变更(如加列、改类型),强制计划可能失效并报错
Query plan for the query does not match the forced plan
真正影响 SELECT 性能的,往往不是某项“新功能”,而是自动索引是否覆盖了你的 WHERE 条件、批模式是否被意外绕过、以及查询存储中那个被强制的计划是否还匹配当前数据分布——这些点不显眼,但一出问题就是 P99 延迟突增。


















