为什么字符串字段上的聚合比 int 字段上的聚合更快?

Why is aggregation on a string field faster than aggregation on an int field?

我有一个 table 包含以下列:

.create-merge table events
(
  Time: datetime,
  SiteId: int,
  SiteCode: string,
  ...
)

站点 ID 和代码都为站点提供唯一值,理论上使用哪一个并不重要,除非我在输出中需要某种数据类型。但是,我发现查询之间的性能存在明显差异:

events | summarize count() by SiteCode
~ 300 ms on a 150M rows table
events | summarize count() by SiteId
~ 560 ms on a 150M rows table

绝对值差异很小,但字符串一比整数快近两倍(为了一致的结果,我从同一地区的客户端发出请求)。字符串代码由 10-20 个字符组成,从直觉上看,与 4 字节整数相比,它在计算机内存中的占用空间更大,因此我希望对字符串 1 进行更长的处理,但它的工作原理恰恰相反。

这可能是什么原因?我遗漏了 ADX 内部的一些基本知识?

假设您使用的是 EngineV3,您会看到此引擎中实施的字典编码优化的影响,在某些情况下,字符串值被编码为小而高效的 int 值,因此性能更好。随着 EngineV3 的不断改进,此优化也可能会添加到 int 值中。