CentOS 上 SQL Server 查询优化的实用清单
一 环境与资源配置
- 存储与 I/O:优先使用 SSD/NVMe,并将 数据文件与事务日志文件分别放在不同磁盘,降低 I/O 争用。
- 内存:为 SQL Server 设置合理的最大内存上限,避免与操作系统和其他服务争用;在 CentOS 上通过 mssql-conf 或环境变量配置内存,确保缓冲池能覆盖热点数据。
- 资源隔离:为数据库实例绑定合适的 CPU 亲和性 与 NUMA 策略,减少跨 NUMA 访问带来的延迟。
- 监控工具:结合 SQL Server Profiler、Performance Monitor 与 DMV(动态管理视图)持续观察 CPU、内存、磁盘 I/O、等待统计,定位瓶颈。
二 索引与统计信息
- 索引设计:优先为高频 WHERE、JOIN、ORDER BY、GROUP BY 列建立索引;合理选择 聚集索引(适合范围与顺序扫描)与 非聚集索引(适合点查与覆盖);利用 覆盖索引 减少回表;对多条件查询设计 复合索引 并注意列顺序与选择性。
- 索引维护:定期 重建/重组索引 并 更新统计信息,避免碎片化与过期统计导致执行计划退化。
- 取舍与规范:删除 重复/极少使用 的索引以降低写入开销;避免在 高基数但低选择性 的列上盲目建索引。
三 SQL 写法与执行计划
- 只查需要的列:避免 **SELECT ***,减少 I/O 与网络开销。
- 优化 JOIN 与子查询:优先使用合适的 INNER/LEFT JOIN 替代复杂子查询,确保 JOIN 键有索引。
- 避免索引失效:不要在索引列上使用函数或表达式(如 WHERE SUBSTRING(name,1,3)=‘abc’),改为 WHERE name LIKE ‘abc%’;避免在 WHERE 中对列做运算(如 num/2=100 改为 num=200);谨慎使用 OR,可用 UNION ALL 拆分;LIKE ‘%abc%’ 通常无法走索引,考虑 全文检索 或改写。
- 空值与比较:减少 IS NULL/IS NOT NULL 的使用(通常难以走索引),必要时用默认值或改写条件;避免在 WHERE 中对列做计算或函数包装。
- 参数嗅探与计划缓存:对参数化查询注意 参数嗅探 带来的计划偏差,必要时使用 OPTION (RECOMPILE) 或 OPTIMIZE FOR 提示稳定计划。
- 执行计划分析:利用 图形化执行计划 识别 扫描/查找、键查找(Key Lookup)、排序/哈希匹配 等成本点,针对性加索引或改写查询。
四 架构与数据生命周期
- 分区表:对 大表 按 时间/范围 做分区,提升 查询裁剪 与维护效率(如按月份分区)。
- 读写分离与缓存:对报表/统计类查询引入 只读副本 或 读写分离;在应用层使用 Redis/Memcached 缓存热点数据,减少数据库压力。
- 数据归档与清理:定期 归档历史数据、清理无用数据,缩小扫描范围,降低维护成本。
- 事务与并发:缩短事务、按 固定顺序 访问多表以降低 死锁;必要时采用 快照隔离 减少读写阻塞。
五 监控与持续优化
- 基线建立:采集并固化 CPU、内存、磁盘 I/O、等待类型、Top SQL 的基线,便于对比优化成效。
- 慢查询定位:使用 SQL Server Profiler 捕获慢事件,配合 执行计划 与 DMV 分析根因。
- 自动调优辅助:利用 Database Engine Tuning Advisor 对工作负载给出 索引/统计 建议,结合实际测试再落地。
- 例行维护:建立 索引重建/重组、统计信息更新、备份验证 的周期性任务,确保长期稳定。