在 Debian 上运行 Microsoft SQL Server(SQL Server on Linux) 时,优化通常从 系统层、SQL Server 配置、数据库设计、查询和监控 几个方面入手。下面按实战角度总结一份较完整的优化指南。
SQL Server 对内存非常敏感。
内存建议
减少 Swap 使用
sudo sysctl -w vm.swappiness=1
写入 /etc/sysctl.conf:
vm.swappiness=1
示例挂载参数(XFS):
/dev/sdb /var/opt/mssql xfs defaults,noatime,nodiratime 0 0
sudo sysctl -w fs.aio-max-nr=1048576
sudo sysctl -w vm.max_map_count=262144
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
默认 SQL Server 会用掉几乎所有内存。
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 12288; -- 示例 12GB
RECONFIGURE;
ALTER DATABASE tempdb
ADD FILE (NAME = temp2, FILENAME = '/var/opt/mssql/data/tempdb2.ndf', SIZE = 512MB);
EXEC sp_configure 'max degree of parallelism', 4;
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;
-- 查看缺失索引
SELECT * FROM sys.dm_db_missing_index_details;
-- 重建索引
ALTER INDEX ALL ON dbo.Orders REBUILD;
UPDATE STATISTICS dbo.Orders;
自动更新统计信息保持开启。
NVARCHAR(MAX) 滥用SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT *sudo cat /var/opt/mssql/log/errorlog
SELECT * FROM sys.dm_os_wait_stats;
SELECT * FROM sys.dm_exec_requests;
top
htop
iostat -x 1
vmstat 1
| 问题 | 可能原因 |
|---|---|
| CPU 高 | 缺失索引 / 并行度过高 |
| 磁盘 IO 高 | Tempdb / 日志盘瓶颈 |
| 内存不足 | max server memory 未限制 |
| 查询慢 | 统计信息过期 / 执行计划差 |
如果你愿意,可以告诉我:
我可以给你 更针对性的优化方案或参数示例。