在 Ubuntu 上运行 SQL Server(SQL Server on Linux) 时,优化通常从 系统层、SQL Server 配置、数据库设计、查询和监控 几个方面入手。下面给你一套比较实用的优化清单。
SQL Server 对内存非常敏感。
物理内存建议
限制 SQL Server 内存使用
EXEC sp_configure 'max server memory (MB)', 8192;
RECONFIGURE;
(避免 OS 被压垮)
swapoff -a # 临时
或设置 vm.swappiness=1
sysctl vm.swappiness=1
defaults,noatime,nodiratime,discard
SELECT name, value, value_in_use
FROM sys.configurations
ORDER BY name;
-- 最大并行度(OLTP 建议 1 或 4)
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
-- 并行阈值
EXEC sp_configure 'cost threshold for parallelism', 30;
RECONFIGURE;
-- 最大内存
EXEC sp_configure 'max server memory (MB)', 8192;
RECONFIGURE;
查看缺失索引:
SELECT *
FROM sys.dm_db_missing_index_details;
创建示例:
CREATE INDEX IX_Order_CustomerId
ON Orders(CustomerId);
SELECT *❌ 错误:
WHERE CONVERT(VARCHAR, CreateTime) = '2024-01-01'
✅ 正确:
WHERE CreateTime >= '2024-01-01'
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT name, physical_name
FROM sys.master_files
WHERE database_id = 2;
建议:
top
htop
iostat -x 1
free -m
SELECT * FROM sys.dm_exec_requests;
SELECT * FROM sys.dm_os_wait_stats
ORDER BY wait_time_ms DESC;
| 问题 | 原因 | 解决 |
|---|---|---|
| CPU 高 | 缺索引 / 并行 | 建索引 |
| IO 高 | 日志 / tempdb | 分盘 |
| 内存不足 | max memory | 限制内存 |
| 锁等待 | 长事务 | 优化事务 |
| 慢查询 | 执行计划差 | 重写 SQL |
max server memory = 12288
max degree of parallelism = 4
cost threshold for parallelism = 30
tempdb files = 8
如果你愿意,可以告诉我:
我可以给你 更针对性的优化方案。