このトピックでは、ページビュー (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;例
データを準備します。
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);次のクエリを実行します。
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)