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

uniqCombined

计算不同参数值的近似数量。

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

uniqCombined 函数是计算不同值的数量的良好选择。

参数

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

返回值

  • 一个 UInt64-类型数字。

实现细节

uniqCombined 函数

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

由于它对非 String 类型使用 32 位哈希,因此对于远大于 UINT_MAX 的基数,结果将具有非常高的误差(误差将在数百亿个不同值之后迅速增加),因此在这种情况下,您应该使用 uniqCombined64

uniq 函数相比,uniqCombined 函数

  • 消耗的内存少几倍。
  • 计算精度高几倍。
  • 通常性能略低。在某些情况下,例如,对于通过网络传输大量聚合状态的分布式查询,uniqCombined 的性能可能优于 uniq

示例

查询

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

结果

┌─uniqCombined(number)─┐
│ 1001148 │ -- 1.00 million
└──────────────────────┘

有关 uniqCombineduniqCombined64 在更大输入的情况下差异的示例,请参见 uniqCombined64 的示例部分。

参见