关于 azure-sql-optimization
面向 Azure SQL Database 管理者与开发者的优化参考技能,涵盖性能监控、自动调优、连接配置和成本控制,并提供 Azure 专属限制与处理方式。
主要功能
- 01比较服务层级与 DTU、vCore
- 02查询资源与性能监控示例
- 03自动调优及建议应用
- 04Hyperscale 与无服务器配置
- 05连接池、重试与成本优化
适用场景
- 01选择适合工作负载的服务层级
- 02定位高 CPU 或 I/O 查询
- 03配置自动暂停与只读扩展
- 04评估容量并优化数据库成本
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill azure-sql-optimization安装后在 Claude Code 中输入/azure-sql-optimization确认已加载。
详细介绍
Azure SQL Database 优化
针对 Azure SQL Database 的平台专属优化。
快速参考
服务层级对比
| 层级 | 最适合场景 | 最大容量 | 主要功能 |
|---|---|---|---|
| Basic | 开发/测试、轻量工作负载 | 2 GB | 成本低 |
| Standard | 通用工作负载 | 1 TB | S0-S12 DTU |
| Premium | 高 I/O、低延迟 | 4 TB | P1-P15 DTU |
| General Purpose(vCore) | 大多数工作负载 | 16 TB | 无服务器选项 |
| Business Critical | 高可用性 | 4 TB | 内存中技术、只读副本 |
| Hyperscale | 大型数据库 | 100 TB | 存储自动扩展 |
DTU 与 vCore
| 方面 | DTU | vCore |
|---|---|---|
| 定价 | 资源打包 | 计算与存储分开计费 |
| 控制 | 有限 | 精细控制 |
| 预留容量 | 否 | 是(最高可节省 72%) |
| 无服务器 | 否 | 是(General Purpose) |
| 最适合 | 简单工作负载 | 可预测的工作负载、迁移后的工作负载 |
性能监控
资源消耗
-- Last 15 minutes (avg 15-second intervals)
SELECT
end_time,
avg_cpu_percent,
avg_data_io_percent,
avg_log_write_percent,
avg_memory_usage_percent,
max_worker_percent,
max_session_percent
FROM sys.dm_db_resource_stats
ORDER BY end_time DESC;
-- Historical (last 14 days, hourly)
SELECT
start_time,
end_time,
avg_cpu_percent,
avg_data_io_percent,
avg_log_write_percent
FROM sys.resource_stats
WHERE database_name = DB_NAME()
ORDER BY start_time DESC;
查询性能洞察
-- Top CPU consumers last hour
SELECT TOP 20
qt.query_sql_text,
rs.avg_cpu_time / 1000 AS avg_cpu_ms,
rs.count_executions,
rs.avg_cpu_time * rs.count_executions / 1000 AS total_cpu_ms
FROM sys.query_store_query q
JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id
JOIN sys.query_store_plan p ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats rs ON p.plan_id = rs.plan_id
JOIN sys.query_store_runtime_stats_interval rsi ON rs.runtime_stats_interval_id = rsi.runtime_stats_interval_id
WHERE rsi.start_time >= DATEADD(hour, -1, GETUTCDATE())
ORDER BY rs.avg_cpu_time * rs.count_executions DESC;
自动优化
启用自动优化
-- Enable all auto-tuning options
ALTER DATABASE current
SET AUTOMATIC_TUNING (
FORCE_LAST_GOOD_PLAN = ON,
CREATE_INDEX = ON,
DROP_INDEX = ON
);
-- Check current settings
SELECT * FROM sys.database_automatic_tuning_options;
查看优化建议
-- Current recommendations
SELECT
name,
reason,
score,
state_desc,
is_revertable_action,
is_executable_action,
details
FROM sys.dm_db_tuning_recommendations;
应用建议
-- Force a specific query plan
EXEC sp_query_store_force_plan @query_id = 12345, @plan_id = 67890;
-- Unforce plan
EXEC sp_query_store_unforce_plan @query_id = 12345, @plan_id = 67890;
Hyperscale 功能
存储自动扩展
- 自动扩展至 128 TB
- 无需预先配置存储
- 仅按实际使用的存储付费
读取扩展
-- Connection string option
ApplicationIntent=ReadOnly
-- In application code
"Server=myserver.database.windows.net;Database=mydb;ApplicationIntent=ReadOnly;..."
命名副本
-- Create named replica
ALTER DATABASE MyDatabase
ADD SECONDARY ON SERVER MySecondaryServer
WITH (SERVICE_OBJECTIVE = 'HS_Gen5_2', SECONDARY_TYPE = Named, NAME = N'MyReadReplica');
无服务器配置
配置自动暂停
-- Via Azure Portal, CLI, or PowerShell
-- Set auto-pause delay (minutes), min/max vCores
-- Check current usage
SELECT
cpu_percent,
auto_pause_delay_in_minutes_configured
FROM sys.dm_db_resource_stats_serverless;
无服务器最佳实践
- 用于间歇性工作负载 - 在空闲期间节省成本
- 设置合适的最小 vCore 数量 - 为时间敏感型应用避免冷启动
- 监控自动暂停 - 自动恢复会增加延迟
- 对于持续运行的工作负载,可考虑始终开启 - 预配模式可能更便宜
连接优化
连接池
// .NET connection string
"Server=tcp:myserver.database.windows.net,1433;Database=mydb;
Min Pool Size=10;Max Pool Size=100;Connection Timeout=30;"
重试逻辑
// Azure SQL requires retry logic for transient faults
var options = new SqlRetryLogicOption()
{
NumberOfTries = 5,
DeltaTime = TimeSpan.FromSeconds(1),
MaxTimeInterval = TimeSpan.FromSeconds(30)
};
连接最佳实践
- 使用连接池 - 降低连接开销
- 实现重试逻辑 - 处理暂时性故障(错误 40613、40197)
- 使用重定向连接模式 - 初始连接后性能更佳
- 及时关闭连接 - 不要不必要地占用连接
Azure 特定限制
不支持的功能
- SQL Agent(使用 Azure Functions、Logic Apps)
- 从文件执行 BULK INSERT(使用 Blob Storage)
- 链接服务器(使用 Elastic Query)
- FILESTREAM
- 同一服务器中的跨数据库查询(使用 Elastic Query)
解决方法
从 Blob Storage 批量插入
-- Create credential
CREATE DATABASE SCOPED CREDENTIAL BlobCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'your_sas_token';
-- Create external data source
CREATE EXTERNAL DATA SOURCE BlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://youraccount.blob.core.windows.net/container',
CREDENTIAL = BlobCredential
);
-- Bulk insert
BULK INSERT MyTable
FROM 'data.csv'
WITH (DATA_SOURCE = 'BlobStorage', FORMAT = 'CSV', FIRSTROW = 2);
使用 Elastic Query 进行跨数据库查询
-- On target database
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE DATABASE SCOPED CREDENTIAL ElasticCredential
WITH IDENTITY = 'username', SECRET = 'password';
CREATE EXTERNAL DATA SOURCE RemoteDB
WITH (
TYPE = RDBMS,
LOCATION = 'remote-server.database.windows.net',
DATABASE_NAME = 'RemoteDatabase',
CREDENTIAL = ElasticCredential
);
CREATE EXTERNAL TABLE dbo.RemoteTable (...)
WITH (DATA_SOURCE = RemoteDB);
成本优化
预留容量
- 相较于即用即付,最高可节省 72%
- 期限为 1 年或 3 年
- 可灵活更换或退款
合理调整规格
-- Check if over-provisioned
SELECT
AVG(avg_cpu_percent) AS avg_cpu,
MAX(avg_cpu_percent) AS max_cpu,
AVG(avg_data_io_percent) AS avg_io,
MAX(avg_data_io_percent) AS max_io
FROM sys.dm_db_resource_stats
WHERE end_time >= DATEADD(day, -7, GETUTCDATE());
-- If avg < 40% consistently, consider downsizing
Hyperscale 成本注意事项
- 计算:按秒计费
- 存储:按已用空间按小时计费
- 只读副本:产生额外计算成本
- 内存不会自动释放(请监控并适当扩展或缩减)
评论
支持 Markdown