You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的结果:

nameDataDiskGB
VM2[1500,100,1300,1300,100,100]
VM3[2]
VM1null

效率优势

自连接方案需要两次扫描resources表,而上述两种方案仅需一次扫描,减少了资源消耗,查询效率更高。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:52:50