Cette rubrique explique comment utiliser l'extension roaringbitmap fournie par ApsaraDB RDS for PostgreSQL pour améliorer les performances des requêtes.
Prérequis
L'instance RDS exécute PostgreSQL 12 ou une version ultérieure.
Si votre instance RDS exécute PostgreSQL 17, la version mineure du moteur doit être 20241030 ou ultérieure.
Contexte
Dans un roaring bitmap, les entiers 32 bits sont divisés en 216 blocs. Les entiers de chaque bloc partagent les mêmes 16 bits de poids fort. Les 16 bits de poids faible sont stockés dans un conteneur. Un roaring bitmap utilise un tableau dynamique de conteneurs comme index principal. Il existe deux types de conteneurs : les conteneurs de type tableau pour les blocs clairsemés et les conteneurs de type bitmap pour les blocs denses. Un conteneur de type tableau peut stocker jusqu'à 4 096 entiers, tandis qu'un conteneur de type bitmap en stocke plus de 4 096.
Les roaring bitmaps exploitent cette structure de stockage pour récupérer rapidement des valeurs spécifiques. Ils proposent également des opérations binaires (AND, OR, XOR) entre les deux types de conteneurs, offrant ainsi d'excellentes performances en matière de stockage et de calcul.
Remarques sur l'utilisation
Pour garantir la stabilité de l'extension, nous vous recommandons de mettre à jour votre instance RDS vers la dernière version mineure du moteur.
Pour plus d'informations sur la mise à jour de la version mineure du moteur d'une instance RDS, consultez la rubrique Mettre à niveau la version mineure du moteur.
Procédure
-
Créez l'extension. Exemple :
CREATE EXTENSION roaringbitmap; -
Créez une table destinée à stocker les données roaringbitmap. Exemple :
CREATE TABLE t1 (id integer, bitmap roaringbitmap); -
Appelez la fonction rb_build pour insérer des données roaringbitmap. Exemple :
-- Set the bit value of an array to 1. INSERT INTO t1 SELECT 1,RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]); -- Set the bit values of multiple elements to 1 and aggregate the bit values into a roaring bitmap. INSERT INTO t1 SELECT 2,RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e; -
Exécutez des opérations bitmap telles que OR, AND, XOR et ANDNOT. Exemple :
SELECT RB_OR(a.bitmap,b.bitmap) FROM (SELECT bitmap FROM t1 WHERE id = 1) AS a,(SELECT bitmap FROM t1 WHERE id = 2) AS b; -
Effectuez des opérations d'agrégation bitmap telles que OR, AND, XOR et BUILD pour générer un nouveau roaring bitmap. Exemple :
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; -
Calculez la cardinalité du roaring bitmap, c'est-à-dire le nombre de bits définis sur 1. Exemple :
SELECT RB_CARDINALITY(bitmap) FROM t1; -
Récupérez les indices des bits définis sur 1. Exemple :
SELECT RB_ITERATE(bitmap) FROM t1 WHERE id = 1;
Fonctions de calcul bitmap
Fonction | Entrée | Sortie | Description | Exemple |
rb_build | integer[] | roaringbitmap | Crée un roaring bitmap à partir d'un tableau d'entiers. | |
rb_and | roaringbitmap,roaringbitmap | roaringbitmap | Exécute une opération AND. | |
rb_or | roaringbitmap,roaringbitmap | roaringbitmap | Exécute une opération OR. | |
rb_xor | roaringbitmap,roaringbitmap | roaringbitmap | Exécute une opération XOR. | |
rb_andnot | roaringbitmap,roaringbitmap | roaringbitmap | Exécute une opération ANDNOT. | |
rb_cardinality | roaringbitmap | integer | Calcule la cardinalité. | |
rb_and_cardinality | roaringbitmap,roaringbitmap | integer | Calcule la cardinalité issue d'une opération AND sur deux roaring bitmaps. | |
rb_or_cardinality | roaringbitmap,roaringbitmap | integer | Calcule la cardinalité issue d'une opération OR sur deux roaring bitmaps. | |
rb_xor_cardinality | roaringbitmap,roaringbitmap | integer | Calcule la cardinalité issue d'une opération XOR sur deux roaring bitmaps. | |
rb_andnot_cardinality | roaringbitmap,roaringbitmap | integer | Calcule la cardinalité issue d'une opération ANDNOT sur deux roaring bitmaps. | |
rb_is_empty | roaringbitmap | boolean | Vérifie si un roaring bitmap est vide. | |
rb_equals | roaringbitmap,roaringbitmap | boolean | Vérifie si deux roaring bitmaps sont identiques. | |
rb_intersect | roaringbitmap,roaringbitmap | boolean | Vérifie si deux roaring bitmaps s'intersectent. | |
rb_remove | roaringbitmap,integer | roaringbitmap | Supprime un décalage spécifique d'un roaring bitmap. | |
rb_flip | roaringbitmap,integer,integer | roaringbitmap | Inverse des décalages spécifiques dans un roaring bitmap. | |
rb_minimum | roaringbitmap | integer | Renvoie le plus petit décalage dans un roaring bitmap. Si le roaring bitmap est vide, la valeur -1 est renvoyée. | |
rb_maximum | roaringbitmap | integer | Renvoie le plus grand décalage dans un roaring bitmap. Si le roaring bitmap est vide, la valeur 0 est renvoyée. | |
rb_rank | roaringbitmap,integer | integer | Renvoie le nombre d'éléments inférieurs ou égaux à un décalage spécifié dans un roaring bitmap. | |
rb_iterate | roaringbitmap | setof integer | Renvoie une liste de décalages à partir d'un roaring bitmap. | |
Fonctions d'agrégation bitmap
Fonction | Entrée | Sortie | Description | Exemple |
rb_build_agg | integer | roaringbitmap | Crée un roaring bitmap à partir d'un groupe de décalages. | |
rb_or_agg | roaringbitmap | roaringbitmap | Exécute une opération d'agrégation OR. | |
rb_and_agg | roaringbitmap | roaringbitmap | Exécute une opération d'agrégation AND. | |
rb_xor_agg | roaringbitmap | roaringbitmap | Exécute une opération d'agrégation XOR. | |
rb_or_cardinality_agg | roaringbitmap | integer | Calcule la cardinalité issue d'une opération d'agrégation OR sur deux roaring bitmaps. | |
rb_and_cardinality_agg | roaringbitmap | integer | Calcule la cardinalité issue d'une opération d'agrégation AND sur deux roaring bitmaps. | |
rb_xor_cardinality_agg | roaringbitmap | integer | Calcule la cardinalité issue d'une opération d'agrégation XOR sur deux roaring bitmaps. | |