CentOS 上 SQL Server 性能调优要点
一 系统层与实例层配置
- 内存:为 SQL Server 设置合理的最大内存上限,避免与操作系统和其他服务争用。示例(将最大内存设为16 GB):EXEC sp_configure ‘show advanced options’, 1; RECONFIGURE; EXEC sp_configure ‘max server memory (MB)’, 16384; RECONFIGURE;。Linux 端可用 /opt/mssql/bin/mssql-conf 设置 memory limit,确保为 OS 预留足够缓冲。
- 存储与目录:将数据、日志、备份、错误日志、转储等目录分别放在高性能磁盘上,并按需通过 mssql-conf 调整 default data/log/backup/dump/error log 目录,减少 I/O 争用。
- 网络与端口:统一对外端口(默认1433),在 firewalld 中放行并固化:firewall-cmd --zone=public --add-port=1433/tcp --permanent && firewall-cmd --reload;必要时在 mssql-conf 中设置 TCP port。
- 加密与链路:启用 TLS 加密传输,保护数据在公网/跨机房传输安全。
- 高可用:如启用 Always On,确保节点间网络时延与带宽充足,并按需调整相关服务参数。
二 并行度与执行计划控制
- 并行阈值:合理设置 Cost Threshold for Parallelism(CTP),避免小查询也被并行化;OLTP 场景可适当提高,OLAP/报表可适当降低。
- 最大并发度:Max Degree of Parallelism(MDP)建议结合 CPU 物理核心数与 NUMA 拓扑设置,避免超线程导致过度并行。
- 等待类型识别:持续观察是否存在 CXPACKET(并行等待)与 SOS_SCHEDULER_YIELD(CPU 让出)等高占比等待,配合执行计划与统计信息验证并行策略是否有效。
- 执行计划稳定性:减少参数嗅探带来的计划退化,必要时使用计划指南/查询存储(Query Store)固定高效计划。
三 内存压力与 TempDB 优化
- 内存压力诊断:
- 系统层:SELECT total_physical_memory_kb/1024 AS Total_MB, available_physical_memory_kb/1024 AS Avail_MB FROM sys.dm_os_sys_memory;
- 数据库级:按 clerk 汇总查看各库内存占用,识别异常模块。
- TempDB 建议:
- 将 TempDB 数据文件数量与 CPU 核心数对齐(通常每 4–8 核 1 个文件,上限 8 个),所有文件大小一致,统一增长步长,避免 PFS/GAM 争用。
- 将 TempDB 放在低延迟磁盘(如 SSD/NVMe),与用户数据库分离。
- 内存上限:通过 sp_configure 设置 max server memory,避免 SQL Server 过度占用内存导致 OS 换页。
四 索引与查询优化
- 索引策略:为高频过滤/连接/排序/聚合列建立合适索引,删除冗余/低效索引,减少维护成本;定期重建/重组与更新统计信息。
- 语句与访问路径:避免 SELECT *,减少隐式转换与函数包裹列,优先使用覆盖索引与 SARGable 条件,降低逻辑读与 I/O。
- 执行计划分析:利用执行计划与统计信息定位高成本算子(Key Lookup、Hash Join、Sort、Spill 等),通过索引/改写/参数化等手段优化。
- 计划稳定性:启用并善用 Query Store 监控回归查询,对比历史计划与指标,快速回滚劣化计划。
五 监控与维护例行化
- 监控要点:
- OS 层:持续关注 CPU、内存、磁盘 I/O、网络带宽与队列;I/O 瓶颈优先排查磁盘响应时间与利用率。
- SQL 层:跟踪批处理请求率、编译/重编译率、计划缓存命中率、锁与阻塞、Top SQL(CPU/逻辑读/执行时长)。
- 例行维护:
- 定期更新 SQL Server 与 CentOS 补丁,修复已知性能与稳定性问题。
- 制定备份策略并定期演练恢复,确保 RPO/RTO 达标。
- 建立性能基线,围绕基线做容量与性能评估,避免“临时加机器”式调优。