为什么字符串字段上的聚合比 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 值中。
我有一个 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 值中。