在 Debian 上运行 Microsoft SQL Server(mssql-server) 的优化,通常可以从 系统层、SQL Server 配置、数据库设计、查询与运维 几个方面入手。下面给你一套实用、可落地的优化建议。
SQL Server 对内存非常敏感。
# 关闭 swap(生产建议)
sudo swapoff -a
# 永久关闭:注释 /etc/fstab 中的 swap 行
# 查看内存
free -h
建议:SQL Server 机器 不要使用 swap,否则性能会明显下降。
mkfs.xfs /dev/sdb
挂载示例:
/data xfs defaults,noatime 0 0
/logs xfs defaults,noatime 0 0
编辑 /etc/sysctl.conf:
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
sysctl -p
编辑 /etc/security/limits.conf:
mssql soft nofile 65536
mssql hard nofile 65536
默认 SQL Server 会“吃光”内存。
-- 查看内存配置
EXEC sp_configure 'max server memory';
-- 限制最大内存(例如 16GB)
EXEC sp_configure 'max server memory', 16384;
RECONFIGURE;
一般规则:
系统内存 - 2~4GB = SQL Server max memory
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
建议:
- 4 ~ 8 核:MAXDOP = 4
- OLTP 系统不宜过高
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;
.mdf(数据).ldf(日志)tempdb 多文件-- tempdb 建议:CPU 核数(<=8)
ALTER DATABASE YourDB
SET COMPATIBILITY_LEVEL = 150; -- SQL 2019
ALTER DATABASE YourDB
SET AUTO_UPDATE_STATISTICS ON;
SELECT *SELECT TOP 10
total_worker_time,
execution_count,
total_worker_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;
SELECT *
FROM sys.dm_db_missing_index_details;
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
sys.dm_os_wait_stats
sys.dm_exec_requests
sys.dm_db_index_usage_stats
top
htop
iostat -x 1
docker stats # 如果用容器
✅ 官方支持
❌ 不支持 SQL Agent(需 cron / 外部调度)
❌ 不支持某些 Windows 特性
| 项目 | 建议值 |
|---|---|
| max server memory | 物理内存 - 2G |
| MAXDOP | 4 |
| tempdb | 4~8 文件 |
| 磁盘 | SSD + 日志分离 |
| swap | 关闭 |
如果你愿意,可以告诉我:
我可以给你 更精确的优化配置方案。