多值`in`查询与`has`查询的性能优劣对比咨询
查询性能对比分析
已知条件
Table1包含约10K个唯一ID值Table2包含数十亿行数据,查询需过滤掉其中约50%的行- 列
A为仅存储单个Guid值的字符串 - 列
B为存储多个以|分隔的Guid值的字符串
两个查询的性能分析
查询1
let _IDs = Table1 | distinct ID; Table2 | where A in (_IDs)
这个查询先从Table1提取唯一ID集合,再在Table2中筛选A值属于该集合的行:
A是单Guid值,匹配时做的是等值比较,计算成本极低- 10K量级的ID集合,查询引擎会自动优化为高效的哈希匹配,不会带来额外性能负担
- 如果
Table2的A列有索引,能直接快速定位符合条件的行,进一步提升效率
查询2
Table2 | where B has "constant-value"
这个查询用has操作符在B列的多Guid拼接字符串中匹配常量值:
has是子字符串匹配,需要扫描每个B列字符串的全部内容,计算成本远高于等值匹配B列是多值拼接格式,无法有效利用常规索引(哪怕有全文索引,Guid作为子字符串的匹配效率也远不如等值索引)- 面对数十亿行数据,每一行都要执行子字符串检查,哪怕过滤掉50%,整体计算量也会非常庞大
结论
通常情况下,查询1的性能会显著优于查询2。
内容的提问来源于stack exchange,提问作者Philippe Signoret
相关产品推荐
相关产品推荐

