すべてのプロダクト
Search
ドキュメントセンター

PolarDB:hll (近似集合)

最終更新日:Sep 03, 2026

hll 拡張は HyperLogLog (HLL) データ型を提供し、ページビュー (PV) やユニークビジター (UV) などの指標を高速に推定できます。

前提条件

hll 拡張は、次のPolarDB for PostgreSQLバージョンでサポートされています。

  • PostgreSQL 14 (マイナーエンジンバージョン 14.5.1.0 以降)

  • PostgreSQL 11 (マイナーエンジンバージョン 1.1.28 以降)

説明

PolarDB for PostgreSQL のマイナーエンジンバージョンを確認するには、次のステートメントを実行します。

  • PostgreSQL 14

    SELECT version();
  • PostgreSQL 11

    SHOW polar_version;

背景情報

hll 拡張は、HyperLogLog (HLL) と呼ばれる、可変長で集合のようなデータ型を提供します。これは、指定された精度で個別値の近似値を返すために一般的に使用されます。たとえば、1,280 バイトの HLL データは、高い精度で約 100 億個の個別値を推定できます。HLL は、インターネット広告分析など、近似推定を必要とする業界に適しており、PV や UV などの指標を高速に推定できます。

hll 拡張のインストール

CREATE EXTENSION hll;

基本操作

  • hll 列を持つテーブルを作成します。

    CREATE TABLE agg (id INT PRIMARY KEY, userids hll);
  • INT データ型を hll_hashval 型に変換します。

    SELECT 1::hll_hashval;

    結果:

     hll_hashval
    -------------
     1
    (1 row)

基本演算子

  • hll 型は次の演算子をサポートしています。

    • =

    • !=

    • <>

    • ||

    • #

    例:

    • =

      SELECT hll_add_agg(1::hll_hashval) = hll_add_agg(2::hll_hashval);

      結果:

       ?column?
      ----------
       f
      (1 row)
    • ||

      SELECT hll_add_agg(1::hll_hashval) || hll_add_agg(2::hll_hashval);

      結果:

                       ?column?
      ------------------------------------------
       \x128b7f00000000000000010000000000000002
      (1 row)
    • #

      SELECT #hll_add_agg(1::hll_hashval);

      結果:

       ?column?
      ----------
              1
      (1 row)
  • hll_hashval 型は次の演算子をサポートしています。

    • =

    • !=

    • <>

    例:

    • =

      SELECT 1::hll_hashval = 2::hll_hashval;

      結果:

       ?column?
      ----------
       f
      (1 row)
    • <>

      SELECT 1::hll_hashval <> 2::hll_hashval;

      結果:

       ?column?
      ----------
       t
      (1 row)

基本関数

  • hll_hash_boolean、hll_hash_smallint、hll_hash_bigint などのハッシュ関数がサポートされています。例:

    • SELECT hll_hash_boolean(true);

      結果:

        hll_hash_boolean
      ---------------------
       8849112093580131862
      (1 row)
    • SELECT hll_hash_integer(1);

      結果:

         hll_hash_integer
      ----------------------
       -8604791237420463362
      (1 row)
  • hll_add_agg 関数は、INT 値を hll 形式に変換します。例:

    SELECT hll_add_agg(1::hll_hashval);

    結果:

           hll_add_agg
    --------------------------
     \x128b7f0000000000000001
    (1 row)
  • hll_union 関数は、hll 値の和集合を計算します。例:

    SELECT hll_union(hll_add_agg(1::hll_hashval), hll_add_agg(2::hll_hashval));

    結果:

                    hll_union
    ------------------------------------------
     \x128b7f00000000000000010000000000000002
    (1 row)
  • hll_set_defaults 関数は、精度パラメータを設定します。例:

    SELECT hll_set_defaults(11,5,-1,1);

    結果:

     hll_set_defaults
    ------------------
     (11,5,-1,1)
    (1 row)
  • hll_print 関数は、デバッグ情報を出力します。例:

    SELECT hll_print(hll_add_agg(1::hll_hashval));

    結果:

                                      hll_print
    -----------------------------------------------------------------------------
     EXPLICIT, 1 elements, nregs=32768, nbits=5, expthresh=-1(2560), sparseon=1:+
     0:                    1
    (1 row)

hll 拡張のアンインストール

DROP EXTENSION hll;

使用例

  1. サンプルデータを準備します。

    CREATE TABLE access_date (acc_date DATE UNIQUE, userids hll);
    INSERT INTO access_date
         SELECT current_date, hll_add_agg(hll_hash_integer(user_id))
         FROM generate_series(1,10000) t(user_id);
    INSERT INTO access_date
         SELECT current_date-1, hll_add_agg(hll_hash_integer(user_id))
         FROM generate_series(5000,20000) t(user_id);
    INSERT INTO access_date
         SELECT current_date-2, hll_add_agg(hll_hash_integer(user_id))
         FROM generate_series(9000,40000) t(user_id);
  2. 次のクエリを実行します。

    • SELECT #userids FROM access_date WHERE acc_date=current_date;

      結果:

           ?column?
      ------------------
       9725.852733707077
      (1 row)
    • SELECT #userids FROM access_date WHERE acc_date=current_date-1;

      結果:

           ?column?
      ------------------
       14968.65968832792
      (1 row)
    • SELECT #userids FROM access_date WHERE acc_date=current_date-2;

      結果:

           ?column?
      ------------------
       29361.520914991113
      (1 row)