优化 Debian 上的 SQL Server(Microsoft SQL Server on Linux) 通常从 系统层、SQL Server 配置、数据库设计、查询和监控 几个方面入手。下面按实战角度总结一份优化清单。
SQL Server 对内存非常敏感。
sudo swapoff -a
# 或限制 swappiness
echo 1 | sudo tee /proc/sys/vm/swappiness
永久配置:
sudo nano /etc/sysctl.conf
vm.swappiness=1
/data -> 数据文件
/log -> 事务日志
/tempdb -> tempdb
挂载示例(xfs):
mkfs.xfs /dev/sdb
mount /dev/sdb /data
sudo nano /etc/sysctl.conf
fs.aio-max-nr = 1048576
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
net.core.somaxconn = 65535
应用:
sudo sysctl -p
确保版本最新(修复性能 Bug):
sudo apt update
sudo apt install mssql-server
查看当前内存限制:
EXEC sp_configure 'max server memory';
设置(示例 8GB 服务器,留 2GB 给系统):
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory', 6144; -- MB
RECONFIGURE;
避免小查询占用多核:
EXEC sp_configure 'cost threshold for parallelism', 50;
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
CREATE INDEX IX_Order_UserID
ON Orders(UserID)
INCLUDE (OrderDate, Status);
UPDATE STATISTICS TableName;
或自动:
ALTER DATABASE YourDB
SET AUTO_UPDATE_STATISTICS ON;
ALTER DATABASE tempdb
ADD FILE (NAME = temp2, FILENAME = '/tempdb/tempdb2.ndf');
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
查看:
❌ 不推荐:
SELECT * FROM Users WHERE YEAR(CreateTime)=2024;
✅ 推荐:
SELECT * FROM Users
WHERE CreateTime >= '2024-01-01'
AND CreateTime < '2025-01-01';
❌:
SELECT * FROM T ORDER BY id OFFSET 100000 ROWS;
✅:
SELECT * FROM T
WHERE id > @lastId
ORDER BY id
LIMIT 100;
top
htop
iostat -x 1
SELECT * FROM sys.dm_exec_requests;
SELECT * FROM sys.dm_os_wait_stats
ORDER BY wait_time_ms DESC;
SELECT TOP 10
total_elapsed_time/execution_count AS avg_time,
text
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
ORDER BY avg_time DESC;
BACKUP LOG YourDB TO DISK='/backup/log.trn';
| 现象 | 可能原因 |
|---|---|
| CPU 高 | 缺失索引 / 并行度过高 |
| 磁盘 IO 高 | tempdb / 日志同盘 |
| 内存不足 | max server memory 未设 |
| 查询慢 | 统计信息过期 |
| 连接超时 | 文件描述符不足 |
如果你愿意,可以提供:
我可以给你一套 针对性优化方案。