Azure资源图KQL查询:mv-expand空数据处理的高效替代方案咨询
解决Azure资源图KQL查询缺失无数据盘VM的高效方案
问题背景
要提取VM1、VM2、VM3三台虚拟机的数据盘信息,其中VM1无数据盘。原查询用mv-expand展开数据盘数组后,会自动过滤空数组对应的行,导致VM1的记录丢失。目前通过自左连接实现了需求,但想找到更高效的替代方法。
原查询问题分析
原查询里mv-expand stgProfile = properties.storageProfile.dataDisks这一步,当dataDisks是空数组时,该行会被直接过滤,所以VM1不会出现在结果中。
高效替代方案
无需自连接,仅通过单表扫描就能处理数据盘数组,保留所有VM记录:
方案1:直接处理数组(推荐)
resources | where type =~ 'Microsoft.Compute/virtualMachines' | where name in ('VM1','VM2','VM3') | extend DataDiskGB = // 判断数据盘数组是否为空,为空返回null,否则生成磁盘大小列表 iif(array_length(properties.storageProfile.dataDisks) == 0, dynamic(null), make_list(properties.storageProfile.dataDisks.diskSizeGB) ) | project name, DataDiskGB
方案2:使用mv-apply保留空数组
mv-apply支持expand_empty=true参数,强制保留数组为空的行:
resources | where type =~ 'Microsoft.Compute/virtualMachines' | where name in ('VM1','VM2','VM3') | mv-apply expand_empty=true stgProfile = properties.storageProfile.dataDisks on ( summarize diskSizes = make_list(stgProfile.diskSizeGB) ) // 空数组生成的空列表转为null,和需求格式对齐 | extend DataDiskGB = iif(array_length(diskSizes) == 0, dynamic(null), diskSizes) | project name, DataDiskGB
结果展示
两种方案都会返回包含所有三台VM的结果:
| name | DataDiskGB |
|---|---|
| VM2 | [1500,100,1300,1300,100,100] |
| VM3 | [2] |
| VM1 | null |
效率优势
自连接方案需要两次扫描resources表,而上述两种方案仅需一次扫描,减少了资源消耗,查询效率更高。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

