我想在Azure数据库没有高负载时执行命令,即DTU百分比低于10%。此查询为我提供了DTU百分比。
SELECT TOP (1) end_time, (SELECT Max(v)
FROM (VALUES (avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS
value(v)) AS [avg_DTU_percent]
FROM sys.dm_db_resource_stats;
文档说它每15秒更新一次。这是否意味着信息过时了15秒?如果我在执行密集操作之前立即运行此查询,我会知道我不会最大化DTU,(接受操作本身不会这样做)?
在执行另一个命令之前,还有其他方法可以检查数据库的负载吗?
如果您单独验证每个资源消耗,如下面的查询所示,它会有所帮助。您可以根据需要将80调整为查询的阈值。
SELECT
(COUNT(end_time) - SUM(CASE WHEN avg_cpu_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'CPU Fit Percent'
,(COUNT(end_time) - SUM(CASE WHEN avg_log_write_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Log Write Fit Percent'
,(COUNT(end_time) - SUM(CASE WHEN avg_data_io_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Physical Data Read Fit Percent'
FROM sys.dm_db_resource_stats
例如,如果您在Azure SQL数据库上看到avg_log_write_percent接近或等于100%,那么限制会影响您的数据库,并且CPU或其他单个措施所说的并不重要。在这种情况下,您的SQL数据库处于高负载状态,并且您不希望添加更多负载。
在下面的查询中,我添加了数据库当前层的DTU限制,因此您可以比较平均DTU限制与过去5分钟内的平均DTU消耗,并决定是否要添加额外的工作负载(执行更多指令) )到数据库的当前负载。
DECLARE @s datetime;
DECLARE @e datetime;
SET @s= DateAdd(minute,-5,GetUTCDate());
SET @e= GETUTCDATE();
SELECT
end_time AS [EndTime]
, (SELECT Max(v) FROM (VALUES (avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS value(v)) AS [AvgDTU_Percent]
, ((dtu_limit)*((SELECT Max(v) FROM (VALUES (avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS value(v))/100.00)) AS [AvgDTUsUsed]
, dtu_limit AS [DTULimit]
FROM sys.dm_db_resource_stats
WHERE end_time BETWEEN @s AND @e