Topik ini menjelaskan ekstensi hll, yang mendukung tipe data HyperLogLog untuk memperkirakan indikator seperti jumlah tampilan halaman (PV) dan pengunjung unik (UV).
Prasyarat
Ekstensi ini didukung pada kluster PolarDB for PostgreSQL (Compatible with Oracle) yang menjalankan PolarDB for PostgreSQL (Compatible with Oracle) 2.0 (versi revisi 2.0.14.1.0 atau lebih baru).
Anda dapat mengeksekusi pernyataan berikut untuk melihat versi minor:
SHOW polar_version;Informasi latar belakang
Ekstensi hll mendukung tipe data HyperLogLog (hll), yang bersifat dapat diperluas dan menyerupai set untuk memperkirakan elemen DISTINCT dengan akurasi tertentu. Sebagai contoh, Anda dapat menggunakan 1.280 byte data hll untuk memperkirakan miliaran elemen DISTINCT secara akurat. Ekstensi hll cocok untuk industri yang membutuhkan analisis estimasi, seperti analisis iklan Internet untuk memperkirakan PV dan UV.
Buat ekstensi hll
CREATE EXTENSION hll;Operasi dasar
Eksekusi pernyataan berikut untuk membuat tabel yang berisi bidang hll:
CREATE TABLE agg (id INT PRIMARY KEY, userids hll);Eksekusi pernyataan berikut untuk mengonversi data INT menjadi data hll_hashval:
SELECT 1::hll_hashval;Hasil berikut dikembalikan:
hll_hashval ------------- 1 (1 row)
Operator dasar
Tipe data hll mendukung operator berikut:
=
!=
<>
||
#
Contoh:
=
SELECT hll_add_agg(1::hll_hashval) = hll_add_agg(2::hll_hashval);Hasil berikut dikembalikan:
?column? ---------- f (1 row)||
SELECT hll_add_agg(1::hll_hashval) || hll_add_agg(2::hll_hashval);Hasil berikut dikembalikan:
?column? ------------------------------------------ \x128b7f00000000000000010000000000000002 (1 row)#
SELECT #hll_add_agg(1::hll_hashval);Hasil berikut dikembalikan:
?column? ---------- 1 (1 row)
Tipe data hll_hashval mendukung operator berikut:
=
!=
<>
Contoh:
=
SELECT 1::hll_hashval = 2::hll_hashval;Hasil berikut dikembalikan:
?column? ---------- f (1 row)<>
SELECT 1::hll_hashval <> 2::hll_hashval;Hasil berikut dikembalikan:
?column? ---------- t (1 row)
Fungsi dasar
Ekstensi hll mendukung fungsi hash seperti hll_hash_boolean, hll_hash_smallint, dan hll_hash_bigint. Contoh:
SELECT hll_hash_boolean(true);Hasil berikut dikembalikan:
hll_hash_boolean --------------------- 8849112093580131862 (1 row)SELECT hll_hash_integer(1);Hasil berikut dikembalikan:
hll_hash_integer ---------------------- -8604791237420463362 (1 row)
Ekstensi hll mendukung fungsi hll_add_agg untuk mengonversi tipe data dari INT ke hll. Contoh:
SELECT hll_add_agg(1::hll_hashval);Hasil berikut dikembalikan:
hll_add_agg -------------------------- \x128b7f0000000000000001 (1 row)Ekstensi hll mendukung fungsi hll_union untuk melakukan operasi UNION pada data hll. Contoh:
SELECT hll_union(hll_add_agg(1::hll_hashval), hll_add_agg(2::hll_hashval));Hasil berikut dikembalikan:
hll_union ------------------------------------------ \x128b7f00000000000000010000000000000002 (1 row)Ekstensi hll mendukung fungsi hll_set_defaults untuk menetapkan akurasi. Contoh:
SELECT hll_set_defaults(15,5,-1,1);Hasil berikut dikembalikan:
hll_set_defaults ------------------ (11,5,-1,1) (1 row)Ekstensi hll mendukung fungsi hll_print untuk menampilkan informasi debug. Contoh:
SELECT hll_print(hll_add_agg(1::hll_hashval));Hasil berikut dikembalikan:
hll_print ----------------------------------------------------------------------------- EXPLICIT, 1 elements, nregs=32768, nbits=5, expthresh=-1(2560), sparseon=1:+ 0: 1 (1 row)
Hapus ekstensi hll
DROP EXTENSION hll;Contoh
Siapkan data.
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);Eksekusi kueri berikut.
SELECT #userids FROM access_date WHERE acc_date=current_date;Hasil:
?kolom? ------------------ 9.725,852733707077 (1 baris)SELECT #userids FROM access_date WHERE acc_date=current_date-1;Hasil:
?kolom? ------------------ 14.968,65968832792 (1 baris)SELECT #userids FROM access_date WHERE acc_date=current_date-2;Hasil:
?column? ------------------ 29.361,520914991113 (1 row)