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

PolarDB:hll

最終更新日:Nov 11, 2024

このトピックでは、ページビュー (PV) やユニークビジター (UV) などのインジケーターを推定するためのHyperLogLogデータ型をサポートするhll拡張機能について説明します。

前提条件

この拡張機能は、PolarDB for PostgreSQL (Oracleと互換) 2.0 (リビジョンバージョン2.0.14.1.0以降) を実行するPolarDB for PostgreSQL (Oracleと互換) クラスターでサポートされています。

説明

次のステートメントを実行して、マイナーバージョンを表示できます。

SHOW polar_version;

背景情報

hll拡張は、拡張可能なセットに似たデータ型HyperLogLog (hll) をサポートして、指定された精度でDISTINCT要素を推定します。 たとえば、1,280バイトのhllデータを使用して、数十億個のDISTINCT要素を正確に推定できます。 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拡張は、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拡張機能は、データ型をINTからhllに変換するhll_add_agg関数をサポートしています。 例:

    SELECT hll_add_agg(1::hll_hashval);

    次の応答が返されます。

           hll_add_agg        
    --------------------------
     \x128b7f0000000000000001
    (1 row)
  • hll拡張は、hll_union関数をサポートして、hllデータに対してUNION操作を実行します。 例:

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

    次の応答が返されます。

                    hll_union                 
    ------------------------------------------
     \x128b7f00000000000000010000000000000002
    (1 row)
  • hll拡張は、精度を設定するためのhll_set_defaults関数をサポートしています。 例:

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

    次の応答が返されます。

     hll_set_defaults 
    ------------------
     (11,5,-1,1)
    (1 row)
  • hll拡張機能は、デバッグ情報を表示する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)