在 Debian 上运行 Microsoft SQL Server(mssql-server) 时,优化通常分为 系统层、SQL Server 配置层、数据库/查询层 三个方向。下面给你一套实用、可落地的优化思路。
SQL Server 对内存非常敏感。
sudo swapoff -a
# 或限制 swappiness
echo 1 | sudo tee /proc/sys/vm/swappiness
max server memory,防止 SQL Server 吃光系统内存:EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 4096; -- 根据机器调整
RECONFIGURE;
/var/opt/mssql/data/var/opt/mssql/lognoatime,nodiratime,discard
echo none | sudo tee /sys/block/sda/queue/scheduler
sudo sysctl -w vm.max_map_count=262144
sudo sysctl -w fs.file-max=2097152
写入 /etc/sysctl.conf 持久化。
SELECT name, value, value_in_use
FROM sys.configurations
ORDER BY name;
-- 并行度(建议 = CPU 核数,不超过 8)
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
-- 并行阈值
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;
-- 最大内存
EXEC sp_configure 'max server memory (MB)', 6144;
RECONFIGURE;
ALTER DATABASE tempdb
ADD FILE (NAME = tempdev2, FILENAME = '/var/opt/mssql/data/tempdb2.ndf', SIZE = 256MB);
SELECT * FROM sys.dm_db_missing_index_details;
ALTER INDEX ALL ON dbo.TableName REBUILD;
UPDATE STATISTICS dbo.TableName;
建议开启自动更新(默认开启)。
SELECT
qs.total_elapsed_time,
qs.execution_count,
SUBSTRING(qt.text, 1, 200)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_elapsed_time DESC;
避免系统自带旧版本:
/etc/apt/sources.list.d/mssql-server.list
SQL Server 日志可能很大:
/var/opt/mssql/log/errorlog
定期:
EXEC sp_cycle_errorlog;
| 现象 | 可能原因 |
|---|---|
| CPU 高 | 缺索引 / 并行度低 |
| 内存满 | max memory 未限制 |
| 磁盘 IO 高 | tempdb / 日志同盘 |
| 查询慢 | 统计信息旧 |
| 连接慢 | Debian 防火墙 / DNS |
你可以告诉我:
SELECT @@VERSION)我可以直接给你 针对性调优方案或具体 SQL。