L'extension pg_roaringbitmap ajoute le type de données roaringbitmap à PolarDB for PostgreSQL, permettant d'effectuer des opérations sur les bitmaps directement en SQL avec une grande efficacité. Les Roaring bitmaps surpassent les formats de bitmap compressés traditionnels tels que WAH, EWAH et Concise. Dans certains scénarios, ils offrent des vitesses d'indexation des centaines de fois supérieures, dépassant même celles des bitmaps non compressés.
Cas d'utilisation typiques : segmentation des utilisateurs, filtrage basé sur des tags, déduplication et requêtes d'appartenance à un ensemble à grande échelle.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance PolarDB for PostgreSQL
Les autorisations nécessaires pour exécuter
CREATE EXTENSIONsur la base de données cible
Activer l'extension
CREATE EXTENSION IF NOT EXISTS roaringbitmap;
Vérifiez l'installation :
SELECT extname, extversion FROM pg_extension WHERE extname = 'roaringbitmap';
Résultat attendu :
extname | extversion
---------------+------------
roaringbitmap | 0.5
(1 row)
Démarrage rapide
Les étapes suivantes décrivent un flux de travail complet : création d'une table, insertion de données bitmap, exécution de calculs et récupération des résultats.
Étape 1 : Créez une table avec une colonne roaringbitmap.
CREATE TABLE t1 (id integer, bitmap roaringbitmap);
Étape 2 : Insérez des données bitmap.
-- rb_build: sets bits at the positions listed in the integer array
INSERT INTO t1 SELECT 1, rb_build(ARRAY[1,2,3,4,5,6,7,8,9,200]);
-- rb_build_agg: aggregates multiple row values into a single bitmap,
-- setting a bit for each row value
INSERT INTO t1 SELECT 2, rb_build_agg(e) FROM generate_series(1,100) e;
Étape 3 : Exécutez des calculs sur les bitmaps (OR, AND, XOR, ANDNOT).
SELECT roaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}'); -- OR
SELECT roaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}'); -- AND
SELECT roaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}'); -- XOR
SELECT roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}'); -- ANDNOT
Étape 4 : Exécutez des calculs d'agrégation sur les bitmaps.
SELECT rb_or_agg(bitmap) FROM t1;
SELECT rb_and_agg(bitmap) FROM t1;
SELECT rb_xor_agg(bitmap) FROM t1;
SELECT rb_build_agg(e) FROM generate_series(1,100) e;
Étape 5 : Obtenez la cardinalité (nombre de bits définis).
SELECT rb_cardinality('{1,2,3}');
Étape 6 : Récupérez les valeurs entières stockées dans un bitmap.
-- Convert to an integer array
SELECT rb_to_array(bitmap) FROM t1 WHERE id = 1;
-- Expand to a set of rows
SELECT unnest(rb_to_array('{1,2,3}'::roaringbitmap));
-- Alternatively, use rb_iterate
SELECT rb_iterate('{1,2,3}'::roaringbitmap);
Formats d'entrée et de sortie
PolarDB prend en charge les formats array et bytea pour l'entrée et la sortie.
Entrée
-- array input
SELECT roaringbitmap('{1,100,10}');
-- roaringbitmap
-- ------------------------------------------------
-- \x3a30000001000000000002001000000001000a006400
-- bytea input
SELECT '\x3a30000001000000000002001000000001000a006400'::roaringbitmap;
-- roaringbitmap
-- ------------------------------------------------
-- \x3a30000001000000000002001000000001000a006400
Sortie
Le format de sortie par défaut est bytea. Utilisez roaringbitmap.output_format pour changer de format.
-- Switch to array output
SET roaringbitmap.output_format = 'array';
SELECT '{1}'::roaringbitmap;
-- roaringbitmap
-- ---------------
-- {1}
-- Switch back to bytea output
SET roaringbitmap.output_format = 'bytea';
SELECT '{1}'::roaringbitmap;
-- roaringbitmap
-- ----------------------------------------
-- \x3a3000000100000000000000100000000100
Opérateurs
Tous les opérateurs renvoient un type roaringbitmap sauf si le type de sortie est indiqué comme bool.
|
Opérateur |
Entrée |
Sortie |
Description |
Exemple |
Résultat |
||
|
|
roaringbitmap, roaringbitmap |
roaringbitmap |
ET binaire (AND) |
|
|
||
|
|
` |
roaringbitmap, roaringbitmap |
roaringbitmap |
OU binaire (OR) |
|
roaringbitmap('{3,4,5}')` |
|
|
|
` |
roaringbitmap, integer |
roaringbitmap |
Ajouter un élément |
|
6` |
|
|
|
` |
integer, roaringbitmap |
roaringbitmap |
Ajouter un élément |
|
roaringbitmap('{1,2,3}')` |
|
|
|
roaringbitmap, roaringbitmap |
roaringbitmap |
OU exclusif binaire (XOR) |
|
|
||
|
|
roaringbitmap, bigint |
roaringbitmap |
Décalage binaire vers la gauche |
|
|
||
|
|
roaringbitmap, bigint |
roaringbitmap |
Décalage binaire vers la droite |
|
|
||
|
|
roaringbitmap, roaringbitmap |
roaringbitmap |
ANDNOT (différence) |
|
|
||
|
|
roaringbitmap, integer |
roaringbitmap |
Supprimer un élément |
|
|
||
|
|
roaringbitmap, roaringbitmap |
bool |
Contient |
|
|
||
|
|
roaringbitmap, integer |
bool |
Contient l'élément |
|
|
||
|
|
roaringbitmap, integer |
bool |
Contient l'élément |
|
|
||
|
|
integer, roaringbitmap |
bool |
Contient |
|
|
||
|
|
roaringbitmap, roaringbitmap |
bool |
Intersection (ET logique) |
|
|
||
|
|
roaringbitmap, roaringbitmap |
bool |
Égal à |
|
|
||
|
|
roaringbitmap, roaringbitmap |
bool |
Différent de |
|
|
Fonctions
Fonctions utilitaires
|
Fonction |
Entrée |
Sortie |
Description |
Exemple |
Résultat |
|
|
integer[] |
roaringbitmap |
Créer un bitmap à partir d'un tableau d'entiers |
|
|
|
|
roaringbitmap, integer |
bigint |
Renvoyer l'index (base 0) d'un élément, ou -1 s'il n'existe pas |
|
|
|
|
roaringbitmap |
bigint |
Renvoyer la cardinalité |
|
|
|
|
roaringbitmap, roaringbitmap |
bigint |
Cardinalité du ET (AND) de deux bitmaps |
|
|
|
|
roaringbitmap, roaringbitmap |
bigint |
Cardinalité du OU (OR) de deux bitmaps |
|
|
|
|
roaringbitmap, roaringbitmap |
bigint |
Cardinalité du OU exclusif (XOR) de deux bitmaps |
|
|
|
|
roaringbitmap, roaringbitmap |
bigint |
Cardinalité du ANDNOT de deux bitmaps |
|
|
|
|
roaringbitmap |
boolean |
Vérifier si le bitmap est vide |
|
|
|
|
roaringbitmap, range_start bigint, range_end bigint |
roaringbitmap |
Ajouter tous les entiers dans [range_start, range_end) |
|
|
|
|
roaringbitmap, range_start bigint, range_end bigint |
roaringbitmap |
Supprimer tous les entiers dans [range_start, range_end) |
|
|
|
|
roaringbitmap, range_start bigint, range_end bigint |
roaringbitmap |
Inverser tous les bits dans [range_start, range_end) |
|
|
|
|
roaringbitmap, range_start bigint, range_end bigint |
roaringbitmap |
Renvoyer les éléments dans [range_start, range_end) |
|
|
|
|
roaringbitmap, range_start bigint, range_end bigint |
bigint |
Cardinalité des éléments dans [range_start, range_end) |
|
|
|
|
roaringbitmap |
integer |
Petit élément ; NULL si vide |
|
|
|
|
roaringbitmap |
integer |
Plus grand élément ; NULL si vide |
|
|
|
|
roaringbitmap, integer |
bigint |
Nombre d'éléments inférieurs ou égaux à la valeur donnée |
|
|
|
|
roaringbitmap, roaringbitmap |
double precision |
Distance de Jaccard (coefficient de similarité de Jaccard) de deux bitmaps |
|
|
|
|
roaringbitmap, bitset_limit bigint, bitset_offset bigint=0, reverse boolean=false, range_start bigint=0, range_end bigint=4294967296 |
roaringbitmap |
Renvoyer le sous-ensemble [offset, offset+limit) des éléments dans [range_start, range_end) |
|
|
|
|
roaringbitmap |
integer[] |
Convertir en tableau d'entiers |
|
|
|
|
roaringbitmap |
SET of integer |
Renvoyer les éléments sous forme d'ensemble de lignes |
|
|
Fonctions d'agrégation
|
Fonction |
Entrée |
Sortie |
Description |
Exemple |
Résultat |
|
|
integer |
roaringbitmap |
Construire un bitmap à partir d'un ensemble de lignes d'entiers |
|
|
|
|
roaringbitmap |
roaringbitmap |
Agrégation OU (OR) sur un ensemble de bitmaps |
|
|
|
|
roaringbitmap |
roaringbitmap |
Agrégation ET (AND) sur un ensemble de bitmaps |
|
|
|
|
roaringbitmap |
roaringbitmap |
Agrégation OU exclusif (XOR) sur un ensemble de bitmaps |
|
|
|
|
roaringbitmap |
bigint |
Agrégation OU (OR), renvoie la cardinalité |
|
|
|
|
roaringbitmap |
bigint |
Agrégation ET (AND), renvoie la cardinalité |
|
|
|
|
roaringbitmap |
bigint |
Agrégation OU exclusif (XOR), renvoie la cardinalité |
|
|