在 Ubuntu 上运行 SQL Server(SQL Server on Linux) 时,优化通常分为 系统层、SQL Server 配置层、数据库设计层、查询层 四个方面。下面给你一套实用优化清单。
SQL Server 对内存非常敏感。
sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 4096
sudo systemctl restart mssql-server
一般留 20–25% 内存给系统
/var/opt/mssql/data → 数据盘/var/opt/mssql/log → 日志盘挂载建议:
mount -o noatime,nodiratime /dev/sdb1 /var/opt/mssql/data
sudo sysctl -w vm.swappiness=1
sudo sysctl -w fs.aio-max-nr=1048576
写入 /etc/sysctl.conf 持久化。
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
SELECT * FROM sys.configurations;
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max degree of parallelism', 4;
EXEC sp_configure 'cost threshold for parallelism', 30;
RECONFIGURE;
MAXDOP:CPU 核数 ≤ 8 时设为核数,>8 建议 4–8cost threshold:避免小查询并行在 Linux 上 TempDB 默认 1 个文件。
ALTER DATABASE tempdb
ADD FILE (NAME = tempdev2, FILENAME = '/var/opt/mssql/data/tempdb2.ndf', SIZE = 512MB);
一般:
ALTER INDEX ALL ON 表名 REBUILD;
或:
UPDATE STATISTICS 表名;
INT 不用 BIGINTDATETIME2 替代 DATETIMENVARCHAR 仅当必须❌ 不建议:
SELECT *
LIKE '%abc%'
WHERE YEAR(时间) = 2024
✅ 建议:
SELECT col1, col2
WHERE 时间 >= '2024-01-01'
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
或用:
SELECT * FROM sys.dm_exec_query_stats;
top
iostat -x 1
free -m
SELECT * FROM sys.dm_os_wait_stats
ORDER BY wait_time_ms DESC;
常见瓶颈:
PAGEIOLATCH → 磁盘慢SOS_SCHEDULER_YIELD → CPU 不够WRITELOG → 日志盘慢| 问题 | 原因 | 解决办法 |
|---|---|---|
| 查询慢 | 缺索引 | 建索引 |
| CPU 高 | 并行过多 | 调 MAXDOP |
| 磁盘 IO 高 | TempDB 单文件 | 加文件 |
| 内存爆 | 未限制 | 设置 memorylimit |
| 写入慢 | 日志盘慢 | 分离日志盘 |
如果你愿意,可以告诉我:
我可以给你 更针对性的优化方案。