在 Debian 上运行 SQL Server(Microsoft SQL Server on Linux) 时,优化主要可以从 系统层面、SQL Server 配置、数据库设计、查询优化 四个方面入手。下面给你一套比较实用的优化思路(适用于 Debian 10/11/12 + SQL Server 2019/2022)。
SQL Server 对内存非常敏感。
# 查看内存
free -h
建议:
sudo swapoff -a
# 或限制 swap 使用
sudo sysctl vm.swappiness=1
永久生效:
echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf
SQL Server 数据文件建议:
mkfs.xfs /dev/sdb
挂载示例:
mkdir /data
mount /dev/sdb /data
/etc/fstab 示例:
/dev/sdb /data xfs defaults,noatime 0 0
编辑 /etc/sysctl.conf:
fs.file-max = 1000000
vm.max_map_count = 262144
net.core.somaxconn = 65535
应用:
sysctl -p
SQL Server 不推荐 THP:
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
永久(systemd):
sudo systemctl disable tuned
默认 SQL Server 会吃光内存。
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 4096; -- 按实际调整
RECONFIGURE;
一般规则:
8 核:MAXDOP = 8
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
Linux 上通常已比 Windows 好,无需额外操作。
.mdf.ldfALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, SIZE = 1024MB);
定期查看缺失索引:
SELECT * FROM sys.dm_db_missing_index_details;
创建示例:
CREATE INDEX IX_User_Email
ON Users(Email);
UPDATE STATISTICS TableName;
自动更新(默认开启):
ALTER DATABASE DatabaseName
SET AUTO_UPDATE_STATISTICS ON;
SELECT Id, Name FROM Users;
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
❌ 错误:
WHERE YEAR(CreateTime) = 2024
✅ 正确:
WHERE CreateTime >= '2024-01-01'
top
htop
iostat -x 1
SELECT * FROM sys.dm_exec_requests;
SELECT * FROM sys.dm_os_performance_counters;
| 问题 | 解决 |
|---|---|
| 内存爆满 | 限制 max server memory |
| CPU 高 | 检查 MAXDOP、慢 SQL |
| 磁盘 IO 高 | 分离数据/日志/TempDB |
| 查询慢 | 建索引、改 SQL |
如果你愿意,可以告诉我:
我可以直接帮你给一套 针对性优化方案。