Tous les produits
Search
Centre de documentation

Hologres:roaringbitmap

Dernière mise à jour :Aug 11, 2026

Les bitmaps Roaring sont des structures de données compressées efficaces, prises en charge par de nombreux langages de programmation et plateformes de big data. Dans Hologres, les fonctions Roaring Bitmap conviennent aux charges de travail à très haute cardinalité : déduplication, filtrage par tag et collecte de séries temporelles.

Fonctionnement

Un bitmap Roaring divise les entiers 32 bits en blocs de 2^16. Les entiers d'un même bloc partagent les 16 bits de poids fort ; les 16 bits de poids faible sont stockés dans un conteneur. Un tableau dynamique sert d'index primaire pour ces conteneurs.

Deux types de conteneurs optimisent le stockage et les performances :

Type de conteneur Utilisation Capacité
Conteneur Array (tableau) Blocs clairsemés Jusqu'à 4 096 entiers
Conteneur Bitmap Blocs denses Plus de 4 096 entiers

Cette structure permet une récupération rapide des valeurs et des opérations binaires efficaces (AND, OR, XOR) entre les conteneurs.

Limites

  • Seules les instances exclusives Hologres V0.10 et ultérieures prennent en charge les fonctions Roaring Bitmap.

    Vérifiez la version de votre instance dans la console Hologres. Si la version est antérieure à la V0.10, mettez l'instance à niveau dans la console ou rejoignez le groupe DingTalk pour obtenir une assistance technique. Consultez les rubriques Common upgrade preparation failure errors et Obtain online support for Hologres .
  • Les fonctions Roaring Bitmap sont chargées par défaut dans le schéma public et ne peuvent être installées que dans ce schéma.

  • À partir de Hologres V3.1, le type de données RoaringBitmap64 est pris en charge. Certaines fonctions Roaring Bitmap peuvent traiter des données de type RoaringBitmap64. Cependant, lors du traitement de données RoaringBitmap64, ces fonctions n'acceptent pas les paramètres d'entrée constants.

  • Avant d'utiliser les fonctions Roaring Bitmap, activez l'extension avec l'instruction suivante. L'extension s'applique à une base de données spécifique : exécutez cette instruction une fois par base de données. Répétez l'opération pour chaque nouvelle base de données créée.

    -- Enable the extension.
    CREATE EXTENSION roaringbitmap;

    Pour supprimer l'extension :

    DROP EXTENSION roaringbitmap;
    Important

    Évitez d'utiliser DROP EXTENSION <extension_name> CASCADE;. L'option CASCADE supprime l'extension ainsi que toutes ses données et tous les objets dépendants, y compris les données PostGIS, les données Roaring Bitmap, les données Proxima, les données de journaux binaires (binary log) et les données BSI, ainsi que les métadonnées, tables, vues et objets serveur dépendants.

  • Les colonnes Roaring Bitmap ne peuvent pas servir d'index bitmap ou dictionary.

  • Lors de la création d'une table contenant une colonne Roaring Bitmap, spécifiez explicitement le type de colonne comme roaringbitmap (32 bits) ou roaringbitmap64 (64 bits). Les calculs mixtes entre ces deux types ne sont pas pris en charge.

    -- Create a table with a 32-bit roaring bitmap column.
    CREATE TABLE t_rb_32 (
        bucket int,
        x roaringbitmap
    );
    
    -- Create a table with a 64-bit roaring bitmap column.
    CREATE TABLE t_rb_64 (
        bucket int,
        x roaringbitmap64
    );
    
    -- Mixed calculations return an error.
    -- ERROR: operator does not exist: roaringbitmap & roaringbitmap64
    SELECT
        a.x & b.x
    FROM
        t_rb_32 a
    JOIN t_rb_64 b ON a.bucket = b.bucket;

Opérateurs

Sauf indication contraire, tous les opérateurs ci-dessous prennent en charge les types RoaringBitmap et RoaringBitmap64.

Opérateur Type d'entrée Type de sortie Description Exemple Résultat
& RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 Identique à l'entrée AND

rb_build('{1,2,3}') & rb_build('{3,4,5}')

{3}

`\ ` RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 Identique à l'entrée

OR

`rb_build('{1,2,3}') \

rb_build('{3,4,5}')`

{1,2,3,4,5}

`\ ` RoaringBitmap \ RoaringBitmap64, INTEGER RoaringBitmap \ RoaringBitmap64

OR (bitmap, entier) ; V1.3.16+

`rb_build('{1,2,3}') \

6`

{1,2,3,6}

`\ ` INTEGER, RoaringBitmap \ RoaringBitmap64 RoaringBitmap \ RoaringBitmap64

OR (entier, bitmap) ; V1.3.16+

`6 \

rb_build('{1,2,3}')`

{1,2,3,6}

# RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 Identique à l'entrée XOR

rb_build('{1,2,3}') # rb_build('{3,4,5}')

{1,2,4,5}

<< RoaringBitmap \ RoaringBitmap64, BIGINT RoaringBitmap \ RoaringBitmap64 Décalage vers la gauche ; V1.3.16+

rb_build('{1,2,3}') << 2

{3,4,5}

>> RoaringBitmap \ RoaringBitmap64, BIGINT RoaringBitmap \ RoaringBitmap64 Décalage vers la droite ; V1.3.16+

rb_build('{1,2,3}') >> 3

- RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 Identique à l'entrée ANDNOT (bitmap, bitmap) ; V1.3.16+

rb_build('{1,2,3}') - rb_build('{3,4,5}')

{1,2}

- RoaringBitmap \ RoaringBitmap64, INTEGER RoaringBitmap \ RoaringBitmap64 ANDNOT (bitmap, entier)

rb_build('{1,2,3}') - 3

{1,2}

@> RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 BOOLEAN A contient B

rb_build('{1,2,3}') @> rb_build('{3,4,5}')

false

@> RoaringBitmap \ RoaringBitmap64, INTEGER BOOLEAN A contient l'entier rb_build('{1,2,3}') @> 3

true

<@ RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 BOOLEAN A est contenu dans B

rb_build('{1,2,3}') <@ rb_build('{3,4,5}')

false

<@ INTEGER, RoaringBitmap \ RoaringBitmap64 BOOLEAN L'entier est contenu dans A 3 <@ rb_build('{1,2,3}')

true

&& RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 BOOLEAN A intersecte B

rb_build('{1,2,3}') && rb_build('{3,4,5}')

true

= RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 BOOLEAN Égal à

rb_build('{1,2,3}') = rb_build('{3,4,5}')

false

<> RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 BOOLEAN Différent de

rb_build('{1,2,3}') <> rb_build('{3,4,5}')

true

Fonctions Roaring Bitmap

Fonctions prenant en charge RoaringBitmap et RoaringBitmap64

Fonction Type d'entrée Type de sortie Description Exemple Résultat
rb_build_agg INTEGER \ BIGINT RoaringBitmap \ RoaringBitmap64 Agrège les décalages dans un bitmap Roaring. L'entrée BIGINT (renvoyant RoaringBitmap64) nécessite la version V3.1 ou ultérieure.

rb_build_agg(1)

{1}

rb_cardinality RoaringBitmap \ RoaringBitmap64 INTEGER Renvoie le nombre d'éléments dans un bitmap Roaring. rb_cardinality(rb_build('{1,2,3,4,5}'))

5

rb_and_cardinality RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 INTEGER Renvoie la cardinalité du AND de deux bitmaps Roaring.

rb_and_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}'))

1

rb_or_cardinality RoaringBitmap \ RoaringBitmap64, RoaringBitmap \ RoaringBitmap64 INTEGER Renvoie la cardinalité du OR de deux bitmaps Roaring.

rb_or_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}'))

5

rb_range RoaringBitmap \ RoaringBitmap64, BIGINT, BIGINT RoaringBitmap \ RoaringBitmap64 Renvoie les éléments dans la plage [start, end), où start est basé sur 1. Nécessite la version V1.3.16 ou ultérieure.

rb_range(rb_build('{1,2,3}'), 2, 3)

rb_minimum RoaringBitmap \ RoaringBitmap64 INTEGER Renvoie le décalage minimum. Renvoie -1 si le bitmap est vide. rb_minimum(rb_build('{1,2,3}'))

1

rb_maximum RoaringBitmap \ RoaringBitmap64 INTEGER Renvoie le décalage maximum. Renvoie 0 si le bitmap est vide. rb_maximum(rb_build('{1,2,3}'))

3

rb_to_array RoaringBitmap \ RoaringBitmap64 INTEGER[] Convertit un bitmap Roaring en tableau d'entiers. rb_to_array(rb_build('{1,2,3}'))

{1,2,3}

rb_to_array_string RoaringBitmap \ RoaringBitmap64, TEXT TEXT Convertit un bitmap Roaring en chaîne, en joignant les éléments avec le délimiteur spécifié. rb_to_array_string(rb_build('{1,2,3}'), ',')

1,2,3

Fonctions prenant uniquement en charge RoaringBitmap64

Fonction Type d'entrée Type de sortie Description Exemple Résultat
rb64_build BIGINT[] RoaringBitmap64 Crée un bitmap Roaring 64 bits à partir d'un tableau BIGINT. Nécessite la version V3.1 ou ultérieure. Voir l'exemple ci-dessous.
-- Prepare data.
CREATE TABLE public.tn (
    id INT,
    num BIGINT[]
);
INSERT INTO public.tn ("id", "num") VALUES (01, '{1,2}');

SELECT rb64_build(num) rb_num, num FROM public.tn;

Sortie attendue :

rb_num                                                                          | num
--------------------------------------------------------------------------------+------
\x030100000000000000000000003a30000001000000000001001000000001000200             | {1,2}

Fonctions prenant uniquement en charge RoaringBitmap (32 bits)

Fonction Type d'entrée Type de sortie Description Exemple Résultat
rb_build INTEGER[] RoaringBitmap Crée un bitmap Roaring 32 bits à partir d'un tableau d'entiers. rb_build('{1,2,3,4,5}') {1,2,3,4,5}
roaringbitmap_in TEXT RoaringBitmap Convertit un bitmap Roaring encodé en TEXT au type RoaringBitmap. Nécessite la version V2.1.33 ou ultérieure. Voir l'exemple ci-dessous.
rb_index RoaringBitmap, INTEGER BIGINT Renvoie l'index basé sur 0 d'un élément. Renvoie -1 si l'élément est absent. Nécessite la version V1.3.16 ou ultérieure. rb_index(rb_build('{1,2,3}'), 3) 2
rb_and_null2empty RoaringBitmap, RoaringBitmap RoaringBitmap Opération AND. Si une entrée est NULL, renvoie l'autre entrée ; si une entrée est un bitmap vide ({}), renvoie {}. Nécessite la version V1.1.42 ou ultérieure. rb_and_null2empty(rb_build(null), rb_build('{3,4,5}')) {}
rb_or_null2empty RoaringBitmap, RoaringBitmap RoaringBitmap Opération OR ; traite les entrées NULL comme des bitmaps vides. Nécessite la version V1.1.42 ou ultérieure. rb_or_null2empty(rb_build(null), rb_build('{3,4,5}')) {3,4,5}
rb_andnot_null2empty RoaringBitmap, RoaringBitmap RoaringBitmap Opération ANDNOT ; traite les entrées NULL comme des bitmaps vides. Nécessite la version V1.1.42 ou ultérieure. rb_andnot_null2empty(rb_build(null), rb_build('{3,4,5}')) {}
rb_and_null2empty_cardinality RoaringBitmap, RoaringBitmap INTEGER Renvoie la cardinalité AND. Traite les entrées NULL comme des bitmaps vides ({}). Nécessite la version V1.1.42 ou ultérieure. rb_and_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) 0
rb_or_null2empty_cardinality RoaringBitmap, RoaringBitmap INTEGER Renvoie la cardinalité OR ; traite les entrées NULL comme des bitmaps vides. Nécessite la version V1.1.42 ou ultérieure. rb_or_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) 3
rb_xor_cardinality RoaringBitmap, RoaringBitmap INTEGER Renvoie la cardinalité du XOR de deux bitmaps Roaring. rb_xor_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) 4
rb_andnot_cardinality RoaringBitmap, RoaringBitmap INTEGER Renvoie la cardinalité du ANDNOT de deux bitmaps Roaring. rb_andnot_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) 2
rb_andnot_null2empty_cardinality RoaringBitmap, RoaringBitmap INTEGER Renvoie la cardinalité ANDNOT ; traite les entrées NULL comme des bitmaps vides. Nécessite la version V1.1.42 ou ultérieure. rb_andnot_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) 0
rb_is_empty RoaringBitmap BOOLEAN Vérifie si un bitmap Roaring est vide. rb_is_empty(rb_build('{1,2,3,4,5}')) false
rb_fill RoaringBitmap, BIGINT, BIGINT RoaringBitmap Remplit les décalages dans [start, end), en excluant la fin. Nécessite la version V1.3.16 ou ultérieure. rb_fill(rb_build('{1,2,3}'), 5, 7) {1,2,3,5,6}
rb_clear RoaringBitmap, BIGINT, BIGINT RoaringBitmap Efface les décalages dans [start, end), en excluant la fin. Nécessite la version V1.3.16 ou ultérieure. rb_clear(rb_build('{1,2,3}'), 2, 3)
rb_contains_bitmap RoaringBitmap, RoaringBitmap BOOLEAN Vérifie si le premier bitmap contient tous les éléments du second. rb_contains_bitmap(rb_build('{1,2,3}'), rb_build('{3}')) true
rb_flip RoaringBitmap, INTEGER, INTEGER RoaringBitmap Inverse les décalages dans la plage spécifiée. rb_flip(rb_build('{1,2,3}'), 2, 3)
rb_range_cardinality RoaringBitmap, BIGINT, BIGINT BIGINT Renvoie la cardinalité des éléments dans [start, end), où start est basé sur 1. Nécessite la version V1.3.16 ou ultérieure. rb_range_cardinality(rb_build('{1,2,3}'), 2, 3)
rb_rank RoaringBitmap, INTEGER INTEGER Renvoie le nombre d'éléments inférieurs ou égaux au décalage spécifié. rb_rank(rb_build('{1,2,3}'), 3) 3
rb_jaccard_dist RoaringBitmap, RoaringBitmap DOUBLE PRECISION Renvoie la distance de Jaccard ou le coefficient de similarité de Jaccard entre deux bitmaps Roaring. Nécessite la version V1.3.16 ou ultérieure. rb_jaccard_dist(rb_build('{1,2,3}'), rb_build('{3,4}')) 0.75
rb_select RoaringBitmap, bitset_limit BIGINT, bitset_offset BIGINT=0, reverse BOOLEAN=false, range_start BIGINT=-2147483648, range_end BIGINT=2147483647 RoaringBitmap Renvoie le sous-ensemble [bitset_offset, bitset_offset+bitset_limit) de la plage [range_start, range_end). rb_select(rb_build('{1,2,3,4,5,6,7,8,9}'), 5, 2)
rb_iterate RoaringBitmap Set of INTEGER Renvoie chaque décalage d'un bitmap Roaring sous forme de ligne. rb_iterate(rb_build('{1,2,3}')) 1, 2, 3

Exemple roaringbitmap_in :

-- Create a sample table.
CREATE TABLE rb_text (
    id int,
    a text
);

-- Insert data.
INSERT INTO rb_text
    VALUES (1, '\x3a300000010000000000090010000000010002000300040005000600070008000900c800');

-- Convert to RoaringBitmap and compute AND cardinality.
SELECT
    rb_and_cardinality_agg(roaringbitmap_in(a::cstring))
FROM
    rb_text;

Sortie attendue :

 rb_and_cardinality_agg
------------------------
                     10

Fonctions d'agrégation Roaring Bitmap

Fonctions prenant en charge RoaringBitmap et RoaringBitmap64

Tous les exemples ci-dessous utilisent une entrée multiligne pour illustrer la fusion de plusieurs bitmaps par agrégation.

Fonction Type d'entrée Type de sortie Description Exemple Résultat
rb_or_agg RoaringBitmap \ RoaringBitmap64 Identique à l'entrée Agrégation OR sur toutes les lignes d'entrée. Voir l'exemple ci-dessous.

rb_and_agg RoaringBitmap \ RoaringBitmap64 Identique à l'entrée Agrégation AND sur toutes les lignes d'entrée. Voir l'exemple ci-dessous.

rb_or_cardinality_agg RoaringBitmap \ RoaringBitmap64 INTEGER Renvoie la cardinalité de l'agrégation OR. Voir l'exemple ci-dessous.

rb_and_cardinality_agg RoaringBitmap \ RoaringBitmap64 INTEGER Renvoie la cardinalité de l'agrégation AND. Voir l'exemple ci-dessous.

-- OR aggregate: returns the union of all input bitmaps.
SELECT rb_or_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- Result: {1,2,3,4}

-- AND aggregate: returns the intersection of all input bitmaps.
SELECT rb_and_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- Result: {2,3}

-- OR cardinality aggregate.
SELECT rb_or_cardinality_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- Result: 4

-- AND cardinality aggregate.
SELECT rb_and_cardinality_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- Result: 2

Fonctions prenant uniquement en charge RoaringBitmap (32 bits)

Fonction Type d'entrée Type de sortie Description Exemple Résultat
rb_xor_agg RoaringBitmap RoaringBitmap Agrégation XOR sur toutes les lignes d'entrée. Voir l'exemple ci-dessous.
rb_xor_cardinality_agg RoaringBitmap INTEGER Renvoie la cardinalité de l'agrégation XOR. Voir l'exemple ci-dessous.
-- XOR aggregate: returns elements in exactly one of the two bitmaps.
SELECT rb_xor_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- Result: {1,4}

-- XOR cardinality aggregate.
SELECT rb_xor_cardinality_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- Result: 2

Autres fonctions Roaring Bitmap

Les fonctions suivantes prennent uniquement en charge le type RoaringBitmap (32 bits).

Fonction Type d'entrée Type de sortie Description Exemple Résultat
roaringbitmap_text TEXT, BOOLEAN RoaringBitmap Désérialise les données binaires RoaringBitmap depuis TEXT vers une structure RoaringBitmap. Le second paramètre contrôle la vérification du format : définissez-le sur true pour éviter les données de bitmap non valides. roaringbitmap_text(':0', true)
rb_to_text RoaringBitmap TEXT Convertit une structure RoaringBitmap en sa représentation binaire TEXT. rb_to_text(rb_build('{1,2,3}')) \x3a300000...

Exemples

L'exemple complet suivant illustre un flux de travail de bout en bout : activation de l'extension, création d'une table, insertion de données, exécution d'opérations binaires et inspection des résultats.

  1. Activez l'extension.

    CREATE EXTENSION roaringbitmap;
  2. Créez une table pour stocker les données Roaring Bitmap.

    -- Create table t1.
    CREATE TABLE public.t1 (id integer, bitmap roaringbitmap);
  3. Insérez des données Roaring Bitmap.

    -- Build a bitmap from an explicit array.
    INSERT INTO public.t1 SELECT 1, RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]);
    
    -- Build a bitmap by aggregating a generated series.
    INSERT INTO public.t1 SELECT 2, RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;
  4. Exécutez des opérations binaires.

    -- OR the two bitmaps.
    SELECT RB_OR(a.bitmap, b.bitmap)
    FROM (SELECT bitmap FROM public.t1 WHERE id = 1) AS a,
         (SELECT bitmap FROM public.t1 WHERE id = 2) AS b;

    Sortie attendue (l'union de {1..9, 200} et {1..100}) :

     rb_or
    -------
     {1,2,3,4,5,6,7,8,9,10,...,100,200}
  5. Exécutez des opérations d'agrégation pour combiner tous les bitmaps de la table.

    SELECT RB_OR_AGG(bitmap)  FROM public.t1;  -- union of all bitmaps
    SELECT RB_AND_AGG(bitmap) FROM public.t1;  -- intersection of all bitmaps
    SELECT RB_XOR_AGG(bitmap) FROM public.t1;  -- symmetric difference
    SELECT RB_BUILD_AGG(id)   FROM public.t1;  -- build a bitmap from the id column
  6. Calculez la cardinalité (le nombre de bits définis).

    SELECT RB_CARDINALITY(bitmap) FROM public.t1;

    Sortie attendue :

     id | rb_cardinality
    ----+----------------
      1 |             10
      2 |            100
  7. Listez tous les décalages définis.

    SELECT RB_ITERATE(bitmap) FROM public.t1 WHERE id = 1;

    Sortie attendue :

     rb_iterate
    ------------
              1
              2
              3
              4
              5
              6
              7
              8
              9
            200
  8. Convertissez un bitmap Roaring en tableau.

    SELECT RB_TO_ARRAY(bitmap) FROM public.t1 WHERE id = 1;

    Sortie attendue :

               rb_to_array
    --------------------------------
     {1,2,3,4,5,6,7,8,9,200}