varbitx adalah ekstensi PolarDB for PostgreSQL yang menyediakan fungsi operasi bit-string lanjutan di luar yang ditawarkan oleh ekstensi varbit standar PostgreSQL. Gunakan ekstensi ini untuk manipulasi bit berkinerja tinggi dalam skenario seperti tagging profil pengguna real-time, kontrol akses iklan, dan sistem tiket.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster PolarDB for PostgreSQL yang menjalankan PostgreSQL 11
Instal ekstensi
CREATE EXTENSION varbitx;Untuk menghapus ekstensi:
DROP EXTENSION varbitx;Fungsi
Semua fungsi menerima dan mengembalikan nilai varbit PostgreSQL standar. Posisi bit menggunakan pengindeksan berbasis nol (bit paling kiri berada di posisi 0).
Ekstraksi bit
| Function | Description | Example |
|---|---|---|
get_bit(bits varbit, start int, count int) returns varbit | Mengembalikan count bit mulai dari posisi start. | get_bit('111110000011', 3, 5) → 11000 |
get_bit_array(bits varbit, start int, count int, value int) returns int[] | Mengambil count bit mulai dari start, lalu mengembalikan posisi bit yang nilainya sama dengan value (0 atau 1). | get_bit_array('111110000011', 3, 5, 1) → [3,4] |
get_bit_array(bits varbit, value int, positions int[]) returns int[] | Dari bit pada positions yang ditentukan, mengembalikan posisi bit yang nilainya sama dengan value (0 atau 1). Bit yang tidak tercantum dalam positions diabaikan. | get_bit_array('111110000011', 1, array[1,5,6,7,10,11]) → [1,10,11] |
Modifikasi bit
| Function | Description | Example |
|---|---|---|
set_bit_array(bits varbit, value int, fill int, positions int[]) returns varbit | Menetapkan bit pada positions yang diberikan ke nilai value (0 atau 1). Memperpanjang string bit jika diperlukan, mengisi bit baru dengan fill (0 atau 1). | set_bit_array('111100001111', 0, 1, array[1,15]) → 1011000011111110 |
set_bit_array(bits varbit, value int, fill int, positions int[], limit int) returns varbit | Sama seperti di atas, tetapi berhenti setelah memproses limit posisi. | set_bit_array('111100001111', 1, 0, array[4,5,6,7], 2) → 111111001111 |
set_bit_array_record(bits varbit, value int, fill int, positions int[]) returns (varbit, int[]) | Menetapkan bit pada positions yang diberikan ke nilai value (0 atau 1), memperpanjang dengan fill jika diperlukan, dan mengembalikan string bit yang telah diperbarui beserta posisi yang diubah. | set_bit_array_record('111100001111', 0, 1, array[1,15]) → 1011000011111110, [1,15] |
set_bit_array_record(bits varbit, value int, fill int, positions int[], limit int) returns (varbit, int[]) | Sama seperti di atas, tetapi berhenti setelah mengubah limit bit. Mengembalikan string bit yang telah diperbarui dan posisi yang benar-benar diubah. | set_bit_array_record('111100001111', 1, 0, array[1,4,5,6,7], 2) → 111111001111, [4,5] |
Generasi bit
| Function | Description | Example |
|---|---|---|
bit_fill(value int, count int) returns varbit | Mengembalikan string bit sepanjang count bit yang semuanya diatur ke nilai value (0 atau 1). | bit_fill(0, 10) → 0000000000 |
bit_rand(count int, value int, ratio float) returns varbit | Mengembalikan string bit sepanjang count bit di mana sekitar ratio bit diatur ke nilai value (0 atau 1), didistribusikan secara acak. | bit_rand(10, 1, 0.3) dapat mengembalikan 0101000001 |
Penghitungan bit
| Function | Description | Example |
|---|---|---|
bit_count(bits varbit, value int) returns int | Menghitung semua bit yang nilainya sama dengan value (0 atau 1). | bit_count('1111000011110000', 1) → 8 |
bit_count(bits varbit, value int, start int, count int) returns int | Menghitung bit yang nilainya sama dengan value dalam rentang count bit mulai dari posisi start. Bit di luar panjang string bit tidak dihitung. | bit_count('1111000011110000', 1, 5, 4) → 1 |
bit_count_array(bits varbit, value int, positions int[]) returns int | Menghitung bit pada positions yang ditentukan yang nilainya sama dengan value (0 atau 1). | bit_count_array('1111000011110000', 1, array[1,2,7,8]) → 3 |
Pencarian posisi
| Function | Description | Example |
|---|---|---|
bit_posite(bits varbit, value int, ascending boolean) returns int[] | Mengembalikan posisi semua bit yang nilainya sama dengan value (0 atau 1). Berikan true untuk urutan ascending, false untuk descending. | bit_posite('11110010011', 1, true) → [0,1,2,3,6,9,10]; bit_posite('11110010011', 1, false) → [10,9,6,3,2,1,0] |
bit_posite(bits varbit, value int, limit int, ascending boolean) returns int[] | Mengembalikan hingga limit posisi bit yang nilainya sama dengan value (0 atau 1). Berikan true untuk urutan ascending, false untuk descending. | bit_posite('11110010011', 1, 3, true) → [0,1,2]; bit_posite('11110010011', 1, 3, false) → [10,9,6] |
Contoh penggunaan
Contoh berikut menunjukkan alur kerja khas untuk sistem tagging pengguna: buat tabel dengan kolom varbit, masukkan data, dan lakukan kueri menggunakan fungsi varbitx.
Buat tabel dengan kolom varbit
CREATE TABLE user_tags (
user_id integer,
tag_bits varbit
);Masukkan data varbit
INSERT INTO user_tags VALUES (1, '1111000011110000');
INSERT INTO user_tags VALUES (2, '1011000011111110');
INSERT INTO user_tags VALUES (3, '0000111100001111');Hitung jumlah tag aktif per pengguna
Hitung bit yang diatur ke 1 (tag aktif) untuk setiap pengguna:
SELECT user_id, bit_count(tag_bits, 1) AS active_tag_count
FROM user_tags;Output yang diharapkan:
user_id | active_tag_count
---------+------------------
1 | 8
2 | 10
3 | 8
(3 rows)Filter pengguna berdasarkan posisi tag
Cari pengguna yang memiliki tag di posisi 0 yang diaktifkan:
SELECT user_id
FROM user_tags
WHERE get_bit(tag_bits, 0, 1) = B'1';Aktifkan tag tertentu dan catat perubahan
Gunakan set_bit_array_record untuk mengaktifkan tag pada posisi tertentu dan mengembalikan posisi yang berubah:
SELECT user_id,
set_bit_array_record(tag_bits, 1, 0, array[1,4,5,6,7], 2)
FROM user_tags
WHERE user_id = 1;Output yang diharapkan:
user_id | set_bit_array_record
---------+----------------------
1 | (1111110011110000,"{4,5}")
(1 row)