在 Debian 上运行 SQL Server 变慢,通常不是“单点原因”,而是系统、SQL Server 配置、查询或环境共同导致的。下面按最常见 → 较少见的顺序给你一个完整排查思路(如果你愿意,可以把具体版本和场景贴出来,我可以直接帮你定位)。
请先确认以下版本:
lsb_release -a
mssql-conf get all
sqlcmd -S localhost -U sa -Q "SELECT @@VERSION"
以及:
SQL Server 非常吃内存,Debian 默认配置下往往不够。
free -h
top
htop
SELECT
physical_memory_in_use_kb / 1024 AS used_mb,
total_server_memory_kb / 1024 AS total_mb
FROM sys.dm_os_process_memory;
✅ 解决 限制 SQL Server 最大内存(非常推荐):
sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 4096
sudo systemctl restart mssql-server
⚠️ 不要给 SQL Server 全部内存,至少留 25% 给 OS
barrieriostat -x 1 5
✅ 推荐配置
data disk: XFS
log disk: 单独磁盘
mount options: noatime,nobarrier
临时关闭 barrier(示例):
mount -o remount,noatime,nobarrier /data
需要注意:
已知差异:
✅ 避免:
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
重点看:
✅ 解决:
UPDATE STATISTICS your_table;
CREATE INDEX IX_xxx ON your_table(col1, col2);
ulimit -a
SQL Server 建议:
fs.file-max = 1000000
vm.swappiness = 1
编辑:
sudo nano /etc/sysctl.conf
添加:
fs.file-max = 1000000
vm.swappiness = 1
生效:
sudo sysctl -p
例如:
WHERE CAST(datetime_col AS DATE) = ...
✅ 改成:
WHERE datetime_col >= '2025-01-01'
AND datetime_col < '2025-01-02'
如果日志没截断:
SELECT name, log_reuse_wait_desc FROM sys.databases;
✅ 解决:
BACKUP LOG yourdb TO DISK = '/var/opt/mssql/backup/log.trn';
DBCC SHRINKFILE (yourdb_log, 1024);
nslookup your_host
ping your_host
✅ 禁用 reverse DNS:
sudo /opt/mssql/bin/mssql-conf set network.disablereversehostname 1
-- 当前慢查询
SELECT TOP 10
total_elapsed_time/execution_count AS avg_time,
execution_count,
total_elapsed_time,
creation_time,
SUBSTRING(text,
(statement_start_offset/2)+1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(text)
ELSE statement_end_offset END
- statement_start_offset)/2) + 1) AS query
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
ORDER BY avg_time DESC;
Debian 上 SQL Server 慢,90% 是因为内存 / IO / 索引 / Linux 系统参数未优化,而不是 Debian 不行。
如果你愿意,可以直接告诉我:
我可以直接给你针对性的优化方案。