在 Ubuntu 上运行 SQL Server(Microsoft SQL Server on Linux) 时,性能优化可以从 系统层、SQL Server 配置、数据库设计、查询优化 四个层面来做。下面给你一套实用清单。
SQL Server 对内存非常敏感。
/etc/sqlserver/launches 或用 mssql-conf:sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 6144
(例如限制为 6GB,避免 OS 被挤死)
重启:
sudo systemctl restart mssql-server
挂载示例(XFS):
mkfs.xfs /dev/sdb
mount -o noatime /dev/sdb /var/opt/mssql
编辑 /etc/sysctl.conf:
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
应用:
sysctl -p
performance 调度器sudo apt install linux-tools-common
sudo cpupower frequency-set -g performance
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
(一般 = CPU 核数的一半,不超过 8)
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;
ALTER DATABASE tempdb
ADD FILE (NAME = temp2, FILENAME = '/var/opt/mssql/data/tempdb2.ndf', SIZE = 256MB);
ALTER INDEX ALL ON dbo.TableName REBUILD;
UPDATE STATISTICS dbo.TableName;
或自动开启(默认开启)
如日志、订单表:
SELECT col1, col2 FROM Table;
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
WHERE CAST(col AS VARCHAR) = '123' -- 不好
WHERE col = 123 -- 好
htop
iostat -x 1
SELECT * FROM sys.dm_exec_requests;
SELECT * FROM sys.dm_os_wait_stats;
SELECT TOP 10 *
FROM sys.dm_exec_query_stats
ORDER BY total_elapsed_time DESC;
| 问题 | 原因 | 解决 |
|---|---|---|
| CPU 高 | 缺索引 | 建索引 |
| IO 高 | 日志盘慢 | 分离日志 |
| 内存爆 | MAXDOP 高 | 调低 |
| 死锁 | 事务长 | 缩短事务 |
如果你愿意,可以告诉我:
我可以给你 更针对性的优化方案。