全部产品
Search
文档中心

Hologres:Fungsi BSI

更新时间:Nov 06, 2025

Topik ini menjelaskan cara menggunakan fungsi indeks bit-sliced (BSI) di Hologres. Fungsi BSI merupakan ekstensi dari Hologres.

Cara kerjanya

Teknik BSI digunakan untuk menekan pasangan kunci-nilai dalam format cid::int, value::bigint. Tabel berikut menyediakan data sampel untuk membantu memahami prinsip dan struktur BSI.

cid

nilai (desimal)

nilai (biner)

1

3

0011

2

6

0110

3

4

0100

4

10

1010

5

7

0111

6

NULL

-

Tabel sampel tersebut mencakup kolom cid dan dua kolom nilai. Nilai desimal maksimum adalah 10, yang sesuai dengan nilai biner 4-bit. Semua nilai desimal dikonversi menjadi nilai biner 4-bit. Data biner ditelusuri dari bit rendah ke bit tinggi. Roaring bitmap dari setiap array cid yang nilai bitnya adalah 1 dicatat untuk membentuk BSI. Berdasarkan data sampel, BSI dengan irisan berikut dihasilkan:

  • irisan 0: roaringbitmap '{1,5}'

  • irisan 1: roaringbitmap '{1,2,4,5}'

  • irisan 2: roaringbitmap '{2,3,5}'

  • irisan 3: roaringbitmap '{4}'

BSI juga mencakup informasi berikut:

  • Bitmap keberadaan (EBM): roaring bitmap yang menyimpan array cid yang tidak kosong. Dalam contoh ini, roaringbitmap '{1,2,3,4,5}' digunakan.

  • maks: nilai maksimum. Dalam contoh ini, nilainya adalah 10.

  • min: nilai minimum. Dalam contoh ini, nilainya adalah 3.

  • bitCount: jumlah bit dari nilai biner yang dikonversi dari nilai desimal. Dalam contoh ini, nilainya adalah 4.

Jika operasi bitmap dilakukan pada data sampel menggunakan roaring bitmap, dan hasil seleksi dari suatu kelompok adalah crowd='{1,3,5}', Anda dapat menggunakan fungsi BSI untuk mendapatkan hasil perhitungan secara cepat. Contoh:

  • Menghitung jumlah nilai dari kelompok yang dipilih: rb_and_cardinality(crowd, slice0) × 2<sup>0</sup> + ... + rb_and_cardinality(crowd, slice3) × 2<sup>3</sup> = 14

  • Menghitung 2 nilai teratas dari kelompok yang dipilih:

    crowd & slice3 = NULL
    crowd & slice2 = {3,5} -- 2 nilai teratas adalah {3,5}.
    {3,5} & slice1 = {5} -- Nilai teratas adalah {5}.

Anda dapat menggunakan algoritma BSI untuk menekan pasangan nilai kunci guna penyimpanan. Perhitungan roaring bitmap dari cids digabungkan dengan perhitungan nilai untuk meningkatkan efisiensi komputasi dalam skenario analisis profil pengguna yang melibatkan tag atribut dan perilaku. Untuk informasi lebih lanjut tentang analisis profil pengguna berdasarkan fungsi BSI, lihat BSI (beta).

Batasan

  • Hanya Hologres V2.1 dan versi lebih baru yang mendukung fungsi BSI. Jika versi instance Hologres Anda lebih lama dari V2.1, tingkatkan instans Anda. Untuk informasi lebih lanjut, lihat Tingkatkan instans.

  • Setiap nilai dalam fungsi BSI harus berupa bilangan bulat dari 1 hingga 231 dikurangi 1.

  • Superuser harus mengeksekusi pernyataan berikut untuk membuat dua ekstensi. Ekstensi harus dibuat pada level database. Anda hanya perlu membuat ekstensi sekali untuk setiap database.

    -- Buat ekstensi. Sebelum Anda membuat BSI, Anda harus membuat roaring bitmap.
    CREATE EXTENSION roaringbitmap;
    CREATE EXTENSION bsi;
    
    -- Hapus ekstensi.
    DROP EXTENSION bsi;
    DROP EXTENSION roaringbitmap;
    Penting

    Kami menyarankan agar Anda tidak mengeksekusi pernyataan DROP EXTENSION <extension_name> CASCADE;. Pernyataan CASCADE tidak hanya menghapus ekstensi yang ditentukan tetapi juga data ekstensi dan objek yang bergantung pada ekstensi tersebut. Data ekstensi mencakup data PostGIS, data roaring bitmap, data Proxima, data log biner, dan data BSI. Objek mencakup metadata, tabel, tampilan, dan data server.

Fungsi

Konstruktor BSI

Fungsi

Tipe data input

Tipe data output

Deskripsi

Contoh

Hasil yang dikembalikan

bsi_build

integer[], bigint[]

bsi

Membuat BSI berdasarkan dua entri data satu dimensi.

SELECT bsi_iterate(bsi_build('{1,2,3}','{2,4,6}'));
{1,2}
{2,4}
{3,6}

bsi_add_value

bsi, integer, bigint

bsi

Menambahkan pasangan nilai-kunci ke BSI.

SELECT bsi_iterate(bsi_add_value(bsi_build('{1,2,3}','{2,4,6}'),4,8));
{1,2}
{2,4}
{3,6}
{4,8}

Fungsi ekspansi BSI

Fungsi

Tipe data input

Tipe data output

Deskripsi

Contoh

Hasil yang dikembalikan

bsi_iterate

bsi

set of integer[]

Memperluas BSI menjadi pasangan nilai-kunci.

SELECT bsi_iterate(bsi_build('{1,2,3}','{2,4,6}'));
{1,2}
{2,4}
{3,6}

bsi_show

bsi/bytea, integer

text

Memperluas BSI menjadi pasangan nilai-kunci dan menampilkan N pasangan nilai-kunci pertama. N adalah bilangan bulat.

SELECT bsi_show(bsi_build('{1,2,3}','{2,4,6}'),2);
1=2,2=4...tersisa 1

Fungsi kueri BSI

Fungsi

Tipe data input

Tipe data output

Deskripsi

Contoh

Hasil yang dikembalikan

bsi_ebm

bsi/bytea

roaringbitmap

Mengkueri roaring bitmap dari array EBM BSI.

SELECT rb_to_array(bsi_ebm(bsi_build('{1,2,3}','{2,4,6}')));
{1,2,3}

bsi_eq

bsi, bigint [, bytea]

roaringbitmap

Mengkueri bagian parameter input pertama tipe BSI yang sama dengan parameter input kedua tipe BIGINT dan mengembalikan roaring bitmap dari array EBM.

Jika parameter input ketiga dikonfigurasi dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input ketiga tipe BYTEA kemudian melakukan perbandingan.

SELECT rb_to_array(bsi_eq(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{2,3}

bsi_filter

bsi/bytea, bytea

bsi

Mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input kedua tipe BYTEA kemudian mengembalikan BSI baru.

SELECT bsi_iterate(bsi_filter(bsi_build('{1,2,3}','{2,4,6}'),rb_build('{1,2}')));
{1,2}
{2,4}

bsi_ge

bsi, bigint [, bytea]

roaringbitmap

Mengkueri bagian nilai parameter input pertama tipe BSI yang lebih besar dari atau sama dengan nilai parameter input kedua tipe BIGINT, kemudian mengembalikan nilai tipe roaring bitmap yang berisi array EBM.

Jika parameter input ketiga ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input ketiga tipe BYTEA kemudian melakukan perbandingan.

SELECT rb_to_array(bsi_ge(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{2,3,4}

bsi_gt

bsi, bigint [, bytea]

roaringbitmap

Mengkueri bagian nilai parameter input pertama tipe BSI yang lebih besar dari nilai parameter input kedua tipe BIGINT kemudian mengembalikan nilai tipe roaring bitmap yang berisi array EBM.

Jika parameter input ketiga ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input ketiga tipe BYTEA kemudian melakukan perbandingan.

SELECT rb_to_array(bsi_gt(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{4}

bsi_le

bsi, bigint [, bytea]

roaringbitmap

Mengkueri bagian nilai parameter input pertama tipe BSI yang kurang dari atau sama dengan nilai parameter input kedua tipe BIGINT kemudian mengembalikan nilai tipe roaring bitmap yang berisi array EBM.

Jika parameter input ketiga ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input ketiga tipe BYTEA kemudian melakukan perbandingan.

SELECT rb_to_array(bsi_le(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{1,2,3}

bsi_lt

bsi, bigint [, bytea]

roaringbitmap

Mengkueri bagian nilai parameter input pertama tipe BSI yang kurang dari nilai parameter input kedua tipe BIGINT, kemudian mengembalikan nilai tipe roaring bitmap yang berisi array EBM.

Jika parameter input ketiga ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input ketiga tipe BYTEA kemudian melakukan perbandingan.

SELECT rb_to_array(bsi_lt(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{1}

bsi_neq

bsi, bigint [, bytea]

roaringbitmap

Mengkueri bagian nilai parameter input pertama tipe BSI yang tidak sama dengan nilai parameter input kedua tipe BIGINT, dan mengembalikan nilai tipe roaring bitmap yang berisi array EBM.

Jika parameter input ketiga ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input ketiga tipe BYTEA kemudian melakukan perbandingan.

SELECT rb_to_array(bsi_neq(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{1,4}

bsi_range

bsi, bigint, bigint [, bytea]

roaringbitmap

Mengkueri bagian parameter input pertama tipe BSI yang berada di antara nilai-nilai parameter input kedua dan ketiga tipe BIGINT, kemudian mengembalikan nilai tipe roaring bitmap yang berisi array EBM.

Jika parameter input ketiga ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input ketiga tipe BYTEA kemudian melakukan perbandingan.

SELECT rb_to_array(bsi_range(bsi_build('{1,2,3,4}','{2,4,4,8}'),3,5));
{2,3}

bsi_compare

text, bsi, [bytea,] bigint, bigint

roaringbitmap

Membandingkan dan menyaring BSI.

  • Parameter input pertama bertipe TEXT yang menentukan jenis perbandingan. Nilai valid: LT, LE, GT, GE, EQ, NEQ, dan RANGE.

  • Parameter ketiga bertipe BYTEA dan bersifat opsional. Parameter ketiga digunakan untuk menyaring BSI.

  • Parameter keempat dan kelima bertipe BIGINT yang menentukan nilai untuk perbandingan. Dua parameter input bertipe BIGINT hanya diperlukan untuk perbandingan berbasis RANGE.

SELECT rb_to_array(bsi_compare('RANGE',bsi_build('{1,2,3,4}','{2,4,4,8}'),3,5));
{2,3}

Fungsi agregasi dan analitik BSI

Fungsi

Tipe data input

Tipe data output

Deskripsi

Contoh

Hasil yang dikembalikan

bsi_add

bsi, bsi

bsi

Mengkueri array EBM yang sama dari dua parameter input tipe BSI, menambahkan nilai-nilai dari array EBM, kemudian mengembalikan BSI baru.

SELECT bsi_iterate(bsi_add(bsi_build('{1,2,3}','{2,4,6}'),bsi_build('{1,2}','{2,4}')));
{1,4}
{2,8}
{3,6}

bsi_add_agg

bsi

bsi

Menjalankan operasi penambahan dan agregasi.

SELECT bsi_iterate(bsi_add_agg(bsi_build('{1,2,3}','{2,4,6}')));
{1,2}
{2,4}
{3,6}

bsi_merge

bsi, bsi

bsi

Menggabungkan dua BSI. Array EBM dari dua BSI tidak memiliki irisan.

SELECT bsi_iterate(bsi_merge(bsi_build('{1,2}','{2,4}'),bsi_build('{3,4}','{6,8}')));
{1,2}
{2,4}
{3,6}
{4,8}

bsi_merge_agg

bsi

bsi

Menggabungkan hasil agregasi. Array EBM dari BSI input tidak memiliki irisan.

SELECT bsi_iterate(bsi_merge_agg(bsi_build('{1,2,3}','{2,4,6}')));
{1,2}
{2,4}
{3,6}

bsi_stat

bigint[], bsi/bytea [, bytea]

text

Mengkueri statistik distribusi nilai BSI. Interval distribusi dibagi berdasarkan array nilai batas input.

Jika parameter input ketiga ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input kedua tipe BSI dan parameter input ketiga tipe BYTEA kemudian mengkueri statistik distribusi.

SELECT bsi_stat('{1,3,5}',bsi_build('{1,2,3,4}','{2,4,6,8}'));
(0,1]=0;(1,3]=1;(3,5]=1;(5,8]=2

bsi_sum

bsi/bytea [, bytea]

bigint[]

Mengembalikan array yang berisi jumlah nilai BSI dan kardinalitas EBM.

Jika parameter input kedua ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input kedua tipe BYTEA kemudian menghitung jumlah dan kardinalitas.

SELECT bsi_sum(bsi_build('{1,2,3,4}','{2,4,6,8}'));
{20,4}

bsi_topk

bsi/bytea, [bytea, ] integer

roaringbitmap

Mengkueri array EBM yang sesuai dengan K nilai BSI terbesar dan mengembalikan roaring bitmap yang terdiri dari array EBM.

Jika parameter input kedua ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input kedua tipe BYTEA kemudian menghitung K nilai BSI terbesar.

SELECT rb_to_array(bsi_topk(bsi_build('{1,2,3,4,5}','{2,4,6,8,10}'),3));
{3,4,5}

bsi_transpose

bsi/bytea [, bytea]

roaringbitmap

Mengembalikan hasil transposisi BSI, yaitu nilai tipe roaring bitmap setelah deduplikasi.

Jika parameter input kedua ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input kedua tipe BYTEA kemudian melakukan transposisi.

SELECT rb_to_array(bsi_transpose(bsi_build('{1,2,3,4,5}','{2,4,4,8,8}')));
{2,4,8}

bsi_transpose_with_count

bsi/bytea [, bytea]

bsi

Men-transpos nilai tipe BSI, mengumpulkan statistik, dan mengembalikan BSI baru.

Jika parameter input kedua ditentukan dan bertipe BYTEA yang diserialisasi dari tipe roaring bitmap, fungsi ini mengkueri irisan antara array EBM parameter input pertama tipe BSI dan parameter input kedua tipe BYTEA kemudian melakukan transposisi dan mengumpulkan statistik.

SELECT bsi_iterate(bsi_transpose_with_count(bsi_build('{1,2,3,4,5}','{2,4,4,8,8}')));
{2,1}
{4,2}
{8,2}