在 Ubuntu 上运行 Microsoft SQL Server(通常是 SQL Server on Linux),优化可以从 系统层、SQL Server 配置、数据库设计、查询和监控 几个方面入手。下面是一套比较实用、可落地的优化思路。
SQL Server 对内存非常敏感。
free -h
swapon --show
建议:
sudo swapoff -a
(永久关闭需编辑 /etc/fstab)
示例挂载:
/mnt/sql-data -> DATA
/mnt/sql-log -> LOG
优化挂载参数:
defaults,noatime,nodiratime
编辑 /etc/sysctl.conf:
vm.swappiness=1
vm.dirty_ratio=10
vm.dirty_background_ratio=5
应用:
sudo sysctl -p
systemctl list-unit-files --type=service
关闭如 cups, bluetooth 等无用服务。
systemctl status mssql-server
默认 SQL Server 会尽量吃内存。
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 6144; -- 示例 6GB
RECONFIGURE;
Linux 上 Tempdb 默认只有 1 个文件。
建议:
ALTER DATABASE tempdb
ADD FILE (NAME = temp2, FILENAME = '/var/opt/mssql/data/tempdb2.ndf', SIZE = 256MB);
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
SELECT *
FROM sys.dm_db_index_physical_stats(NULL,NULL,NULL,NULL,'DETAILED');
重建:
ALTER INDEX ALL ON 表名 REBUILD;
UPDATE STATISTICS 表名;
NVARCHAR(MAX) 存短文本DATETIME2SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT *SELECT * FROM sys.dm_exec_requests;
SELECT * FROM sys.dm_os_wait_stats;
SELECT TOP 10
total_elapsed_time/execution_count AS avg_time,
text
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
ORDER BY avg_time DESC;
top
htop
iotop
| 问题 | 可能原因 |
|---|---|
| CPU 高 | 缺索引 / 并行度过高 |
| 内存高 | max server memory 未限制 |
| 磁盘 IO 高 | 日志和数据同盘 |
| 查询慢 | 统计信息过期 |
如果你愿意,可以告诉我:
SELECT @@VERSION)我可以给你 更针对性的优化方案。