使用macro-expand与union从远程集群过滤数据的性能对比
Kusto跨集群查询性能与过滤逻辑分析
问题背景
针对分布在不同区域、各含数十亿行数据的10个集群,对比以下两种查询的性能差异及执行逻辑:
Query 1
union cluster('c0').database('Data').T, cluster('c1').database('Data').T, // ... cluster('c9').database('Data').T | where Foo == "bar"
Query 2
macro-expand entity_group [ cluster('c0').database('Data'), cluster('c1').database('Data'), // ... cluster('c9').database('Data') ] as X ( X.T | where Foo == "bar" )
问题解答
1. Query 1的执行逻辑
Query 1不会先把所有集群的全量数据传输到执行集群再过滤。Kusto的查询优化器会自动将where过滤逻辑下推到各个远程集群,每个远程集群会先在本地完成Foo == "bar"的过滤,只把符合条件的数据传输到执行集群做后续的union操作。
2. Query 2的执行逻辑理解确认
你的理解是正确的。macro-expand会把定义的实体组展开成对应每个集群的独立查询:每个远程集群都会执行X.T | where Foo == "bar"的逻辑,在本地完成过滤后,再将结果返回给执行集群。
3. 两种查询的性能差异
从执行逻辑和性能表现来看,这两种查询几乎没有差异。因为Query 1的过滤下推是Kusto优化器的默认行为,而Query 2通过macro-expand显式生成了每个集群的本地过滤查询,最终两者的执行路径是一致的——都是在远程集群本地过滤,仅传输少量符合条件的数据,而非全量数据。
唯一的区别可能是Query 2的写法更简洁,当集群数量较多时更容易维护,但性能层面不会有明显差距。
内容的提问来源于stack exchange,提问作者Philippe Signoret
相关产品推荐
相关产品推荐

