メインコンテンツへスキップ
メインコンテンツへスキップ

uniqCombined

異なる引数の値のおおよその数を計算します。

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

uniqCombined 関数は、異なる値の個数を計算する際に適した選択肢です。

引数

  • HLL_precision: HyperLogLog におけるセル数の 2 を底とする対数。省略可能で、uniqCombined(x[, ...]) のように関数を使用できます。HLL_precision のデフォルト値は 17 で、これは実質的に 96 KiB の領域を意味します (2^17 個のセルで、それぞれ 6 ビット)。
  • X: 可変個の引数。引数には TupleArrayDateDateTimeString、または数値型を指定できます。

返される値

実装の詳細

uniqCombined 関数は次のように動作します:

  • 集約内のすべての引数に対してハッシュ値 (String には 64 ビット、それ以外には 32 ビット) を計算し、そのハッシュ値を用いて計算を行います。
  • 3 つのアルゴリズム (配列、ハッシュテーブル、誤差補正テーブル付き 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 の例のセクションを参照してください。

関連項目