请教:查询Azure磁盘可用空间(GB)及占比的KQL语句是否正确?
你的KQL查询分析与优化
你的这条查询核心逻辑是正确的,能获取Azure磁盘的可用空间(GB)和可用百分比,但存在几个可优化点和潜在问题:
现存问题说明
- Inner Join可能导致数据丢失:如果某个磁盘仅上报了
FreeSpaceMB或FreeSpacePercentage其中一个指标,inner join会直接过滤掉该磁盘数据,导致信息缺失。 bin(FreePercent = Val, 1.1)步长不合理:百分比分组用1.1无实际业务意义,通常会选1或0.1来取整。- 时间戳不一致:两个子查询的
TimeGenerated可能不是同一时间点,最终展示的是FreeSpaceMB对应的时间,无法保证是最新的统一时间数据。 - 查询效率待提升:两次扫描
InsightsMetrics表并执行join,相比合并查询的方式开销更大。
优化后的查询语句
InsightsMetrics | where Name in ('FreeSpaceMB', 'FreeSpacePercentage') | summarize arg_max(TimeGenerated, *) by Tags, Computer, Name | extend Drive = tostring(parse_json(Tags)["vm.azm.ms/mountId"]) | extend SizeGB = iif(Name == 'FreeSpaceMB', bin(toreal(parse_json(Tags)["vm.azm.ms/diskSizeMB"]) / 1024, 0.1), double(null)), FreeGB = iif(Name == 'FreeSpaceMB', bin(Val / 1024, 1), double(null)), FreePercent = iif(Name == 'FreeSpacePercentage', bin(Val, 1), double(null)) | summarize LatestTime = max(TimeGenerated), SizeGB = max(SizeGB), FreeGB = max(FreeGB), FreePercent = max(FreePercent) by Computer, Drive | project LatestTime, Computer, Drive, SizeGB, FreeGB, FreePercent | order by Computer asc
优化点说明
- 合并表扫描:通过
where Name in (...)一次扫描表,减少查询开销。 - 避免数据丢失:用
summarize+max聚合同一磁盘的两个指标,即便其中一个指标缺失,也能保留已存在的数据。 - 统一时间戳:取两个指标的最新时间作为
LatestTime,确保展示的是最新有效数据。 - 合理的取整步长:百分比用
bin(Val,1)取整到整数,符合常规需求。
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

