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

uniqCombined64

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

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

参数

  • HLL_precisionHyperLogLog 中单元格数量的以 2 为底的对数。 可选地,你可以将该函数用作 uniqCombined64(x[, ...])。 HLL_precision 的默认值为 17,这实际上是 96 KiB 的空间(2^17 个单元格,每个单元格 6 位)。
  • X:可变数量的参数。参数可以是 TupleArrayDateDateTimeString 或数值类型。

返回值

  • 一个 UInt64 类型的数字。

实现细节

uniqCombined64 函数

  • 计算聚合中所有参数的哈希值(所有数据类型均为 64 位哈希),然后在计算中使用它。
  • 使用三种算法的组合:数组、哈希表和带有错误校正表的 HyperLogLog。
    • 对于少量不同的元素,使用数组。
    • 当集合大小较大时,使用哈希表。
    • 对于大量元素,使用 HyperLogLog,这将占用固定量的内存。
  • 确定性地提供结果(它不依赖于查询处理顺序)。
注意

由于它对所有类型使用 64 位哈希,因此与 uniqCombined 相比,对于远大于 UINT_MAX 的基数,结果不会遭受非常高的误差,后者对非 String 类型使用 32 位哈希。

uniq 函数相比,uniqCombined64 函数

  • 消耗的内存少几倍。
  • 计算精度高几倍。

示例

在下面的示例中,uniqCombined641e10 个不同的数字上运行,返回非常接近不同参数值数量的近似值。

查询

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

结果

┌─uniqCombined64(number)─┐
│ 9998568925 │ -- 10.00 billion
└────────────────────────┘

相比之下,uniqCombined 函数对于这种大小的输入返回的近似值相当差。

查询

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

结果

┌─uniqCombined(number)─┐
│ 5545308725 │ -- 5.55 billion
└──────────────────────┘

另请参阅