优化 Debian 上的 SQL Server,通常可以从 系统层、SQL Server 配置、数据库设计、查询/索引、监控 这几个层面来做。下面给出一套比较实用的优化思路(适用于 SQL Server on Linux / Debian)。
SQL Server 对内存非常敏感:
# 查看内存
free -h
建议:
临时关闭 swap(生产谨慎):
sudo swapoff -a
推荐挂载参数(ext4):
noatime,nodiratime,data=ordered
示例:
/dev/sdb1 /var/opt/mssql xfs defaults,noatime 0 0
编辑 /etc/sysctl.conf:
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
应用:
sudo sysctl -p
编辑 /etc/security/limits.conf:
mssql soft nofile 65535
mssql hard nofile 65535
mssql soft nproc 65535
mssql hard nproc 65535
防止 SQL Server 吃光内存:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 8192; -- 示例
RECONFIGURE;
建议:
避免大查询占满 CPU:
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
一般规则:
避免小查询并行:
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;
推荐值:30–50
.mdf)和日志文件(.ldf)分盘查看:
SELECT name, physical_name FROM sys.master_files;
int 就别用 bigintvarchar 而不是 nvarchar(除非必须)NULL 滥用SELECT *
FROM sys.dm_db_missing_index_details;
SELECT *
FROM sys.dm_db_index_usage_stats;
规则:
user_seeks ✅user_updates、低 user_seeks ❌ALTER INDEX ALL ON 表名 REORGANIZE;
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
重点看:
❌:
SELECT *
WHERE CONVERT(varchar, date, 112) = '20240101'
✅:
WHERE date >= '2024-01-01' AND date < '2024-01-02'
确保不是老旧版本:
apt list --installed | grep mssql
升级:
sudo apt update
sudo apt upgrade mssql-server
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
sudo systemctl restart mssql-server
SELECT * FROM sys.dm_os_performance_counters;
top
htop
iostat -x 1
| 现象 | 原因 | 优化 |
|---|---|---|
| CPU 高 | 并行查询 | MAXDOP / CTFP |
| 内存高 | 无上限 | max server memory |
| IO 高 | 缺失索引 | 建索引 |
| 查询慢 | 全表扫描 | 执行计划 |
| 磁盘满 | 日志未截断 | 备份 / 简单模式 |
你可以直接贴: