在 Debian 上运行 SQL Server(Microsoft SQL Server on Linux) 时,优化通常从 系统层、数据库层、SQL/索引层、监控与维护 四个方面入手。下面按实战角度说明。
SQL Server 在 Linux 上默认会使用几乎全部内存,需手动限制。
编辑 /opt/mssql/bin/mssql-conf 或:
sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 8192
示例:8GB 内存机器,限制 SQL Server 使用 6GB
memorylimitmb = 6144
重启生效:
sudo systemctl restart mssql-server
/var/opt/mssql/data/var/opt/mssql/logatimemount -o noatime /dev/sdb1 /var/opt/mssql
sudo sysctl -w vm.swappiness=1
sudo sysctl -w vm.dirty_ratio=10
sudo sysctl -w vm.dirty_background_ratio=5
持久化:
/etc/sysctl.conf
sudo sysctl -w vm.nr_hugepages=2048
避免 CPU 争用:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
一般规则:
8 核:MAXDOP = 4~8
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;
ALTER DATABASE tempdb
ADD FILE (NAME = tempdev2, FILENAME = '/var/opt/mssql/data/tempdb2.ndf', SIZE = 512MB);
CREATE INDEX IX_Order_User
ON Orders(UserID, CreateTime)
INCLUDE (Status);
SELECT *-- 错误
WHERE YEAR(CreateTime) = 2024
-- 正确
WHERE CreateTime >= '2024-01-01' AND CreateTime < '2025-01-01'
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
使用:
SELECT * FROM sys.dm_exec_query_stats
ORDER BY total_elapsed_time DESC;
SELECT * FROM sys.dm_os_performance_counters;
SELECT * FROM sys.dm_exec_requests;
UPDATE STATISTICS TableName;
ALTER INDEX ALL ON TableName REBUILD;
ALTER DATABASE DBName SET RECOVERY SIMPLE;
| 问题 | 优化方向 |
|---|---|
| CPU 高 | MAXDOP、慢 SQL |
| 内存不足 | memorylimitmb |
| 磁盘 IO 高 | 分离数据/日志 |
| 锁等待 | 事务拆分 |
| 查询慢 | 索引 + 执行计划 |
如果你愿意,可以告诉我:
我可以给你一套针对性的优化方案。