跳到主要内容
跳到主要内容

uniqCombined64

计算不同参数值的近似数量。与 uniqCombined 相同,但对所有数据类型都使用 64 位哈希,而不仅仅是对 String 类型使用。

uniqCombined64(HLL_precision)(x[, ...])

参数

  • HLL_precisionHyperLogLog 中单元数量的以 2 为底的对数。你也可以以 uniqCombined64(x[, ...]) 的形式调用该函数。HLL_precision 的默认值为 17,这在实际中对应 96 KiB 的空间(2^17 个单元,每个 6 bit)。
  • X:可变数量的参数。参数可以是 TupleArrayDateDateTimeString 或数值类型。

返回值

  • 一个 UInt64 类型的数值。

实现细节

uniqCombined64 函数:

  • 对聚合中的所有参数计算哈希(对所有数据类型使用 64 位哈希),然后在计算中使用该哈希值。
  • 使用三种算法的组合:数组、哈希表和带误差修正表的 HyperLogLog。
    • 对少量不同元素,使用数组。
    • 当集合规模更大时,使用哈希表。
    • 对更多数量的元素,使用 HyperLogLog,它会占用固定大小的内存。
  • 以确定性的方式提供结果(不依赖于查询处理顺序)。
注意

由于对所有类型都使用 64 位哈希,对于明显大于 UINT_MAX 的基数,结果不会像 uniqCombined 那样出现非常高的误差;uniqCombined 对非 String 类型使用的是 32 位哈希。

uniq 函数相比,uniqCombined64 函数:

  • 内存占用要少几倍。
  • 计算精度要高几倍。

示例

在下面的示例中,uniqCombined641e10 个不同数字进行计算,返回了一个与不同参数值个数非常接近的近似值。

查询:

SELECT uniqCombined64(number) FROM numbers(1e10);

结果:

┌─uniqCombined64(number)─┐
│             9998568925 │ -- 100 亿
└────────────────────────┘

相比之下,就这个规模的输入而言,uniqCombined 函数返回的近似结果相当不理想。

查询:

SELECT uniqCombined(number) FROM numbers(1e10);

结果:

┌─uniqCombined(number)─┐
│           5545308725 │ -- 55.45 亿
└──────────────────────┘

另请参阅