用途:当有具体的存储过程、视图或 T-SQL 批处理需要重写或改进时使用本技能。它聚焦于修复代码本身;若问题源于硬件或索引,应先使用 sqlserver-diagnostics 和 sqlserver-indexes。
主要能力:
- 存储过程反模式修复。最常见的是每次执行都 DELETE 再 INSERT 同一行,即使数据未变;这会带来两次日志写入、两次索引操作、触发触发器、破坏外键并造成索引碎片。可用 MERGE 做 upsert,或先判断值是否变化再决定 UPDATE/INSERT。
- 游标循环替换为基于集合的操作,例如用单条 UPDATE 处理所有待处理行;若逻辑复杂,可考虑表值参数(TVP)、临时表队列或 STRING_AGG/FOR XML PATH 拼接字符串。
- 非 SARGable 谓词改写,避免在列上套函数,如把 YEAR(OrderDate)=2024 改为范围条件,把 CONVERT 比较改为直接日期比较,把 OrderTotal+100>5000 改为 OrderTotal>4900;前导通配符 LIKE '%Smith%' 无法用索引,需全文搜索或搜索表。
- 隐式转换排查:NVARCHAR 列应使用 N'' 前缀,TINYINT 列不要传字符串;可在执行计划中查找 CONVERT_IMPLICIT,或查询 sys.dm_exec_query_stats 与 sys.dm_exec_sql_text。
- 生产代码避免 SELECT *,显式列出列名,以免表结构变化、多余 I/O 和无法使用覆盖索引。
- 视图优化:默认视图内联展开;索引视图需 SCHEMABINDING、唯一聚集索引和严格 SET 选项,Enterprise 版可自动使用,Standard 版需 WITH (NOEXPAND)。
- CTE、临时表与表变量的选择:CTE 适合一次性、可读性或递归;临时表适合大结果集多次使用、需要索引或统计信息;表变量适合小结果集,但无统计信息。
- 统计信息管理:可用 UPDATE STATISTICS ... WITH FULLSCAN、sp_updatestats,并检查自动更新统计是否开启;大批量加载、建索引后或执行计划异常时可手动更新。
- 查询提示的合理使用:NOLOCK 仅用于报表,绝不用于财务/事务数据;OPTION (RECOMPILE) 可解决参数嗅探;OPTIMIZE FOR UNKNOWN、MAXDOP、FORCE ORDER 应谨慎使用。
使用方式:针对具体 SQL 代码,按上述模式识别并改写;资料未提供安装命令或调用方式。
适用场景:SQL Server 存储过程、视图和 T-SQL 批处理的性能调优与代码重构。
限制:不处理硬件或索引问题;查询提示会锁定行为,需谨慎;NOLOCK 会读取未提交数据;表变量无统计信息可能影响连接估算。