Tous les produits
Search
Centre de documentation

Hologres:Index bitmap

Dernière mise à jour :Aug 11, 2026

Cette rubrique explique comment utiliser les index bitmap dans Hologres.

Présentation

Dans Hologres, la propriété bitmap_columns définit un index bitmap. Indépendant du stockage des données, cet index accélère les requêtes d'égalité. Il utilise un vecteur bitmap pour filtrer rapidement les données au sein des blocs de fichiers, ce qui le rend adapté aux scénarios de filtrage par égalité. Utilisez la syntaxe suivante :

-- Syntax supported by Hologres V2.1 and later
CREATE TABLE <table_name> (...) WITH (bitmap_columns = '[<columnName>{:[on|off]}[,...]]');
-- Syntax supported by all versions
CREATE TABLE <table_name> (...);
CALL set_table_property('<table_name>', 'bitmap_columns', '[<columnName>{:[on|off]}[,...]]');

Paramètre

Description

table_name

Nom de la table.

columnName

Nom de la colonne.

on

Active l'index bitmap pour la colonne spécifiée.

off

Désactive l'index bitmap pour la colonne spécifiée.

Recommandations

  • Créez des index bitmap sur les colonnes fréquemment utilisées dans les requêtes d'égalité. Le système localise ainsi rapidement les numéros de ligne des données correspondantes. Toutefois, l'utilisation d'index bitmap sur des colonnes à forte cardinalité (celles comportant peu de valeurs en double) peut entraîner une surcharge importante du stockage.

  • Évitez de créer des index bitmap sur chaque colonne. Cette pratique non seulement augmente la consommation de stockage, mais réduit également le débit d'écriture, car Hologres doit construire un index pour chaque colonne lors de l'ingestion des données.

  • Ne créez pas d'index bitmap sur les colonnes de type text stockant des données au format JSON.

Limites

  • Les index bitmap sont pris en charge sur les tables orientées colonnes et les tables hybrides lignes-colonnes, mais pas sur les tables orientées lignes.

  • Les colonnes dotées d'un index bitmap peuvent contenir des valeurs nulles.

  • Par défaut, les index bitmap sont créés implicitement sur toutes les colonnes de type text.

  • Exécutez les commandes de configuration des index bitmap en dehors d'une transaction. Les modifications ne prennent pas effet immédiatement, car Hologres crée et supprime les encodages bitmap de manière asynchrone en arrière-plan. Pour plus d'informations, consultez la rubrique ALTER TABLE.

  • La propriété bitmap_columns accepte uniquement les valeurs on ou off. À partir de Hologres V2.0, la définition de la propriété bitmap_columns sur auto n'est plus prise en charge.

Fonctionnement

Contrairement à une clé de distribution ou une clé de clustering, un index bitmap est une structure indépendante du stockage des données. Lorsqu'une requête utilise cet index, elle localise rapidement le numéro de ligne pour filtrer les données. Toutefois, les index bitmap engendrent une surcharge. Prenez en compte les scénarios suivants :

  • Colonnes à forte cardinalité : Hologres génère un bitmap pour chaque valeur distincte. Si les valeurs uniques sont nombreuses, ce processus forme un tableau clairsemé qui consomme beaucoup d'espace de stockage.

  • Toutes les colonnes d'une table large possèdent des index bitmap : si vous créez un index bitmap pour chaque colonne d'une table large, Hologres doit construire un bitmap pour chaque valeur lors de l'ingestion des données, ce qui crée une surcharge système et réduit le débit d'écriture.

En résumé, un index bitmap repose sur un compromis entre l'espace et le temps. Il s'avère particulièrement rentable pour les colonnes dont la distribution des données est relativement uniforme.位图索引

Comme illustré dans l'exemple suivant, utilisez explain SQL pour vérifier si une requête utilise un index bitmap. Si le plan d'exécution contient Bitmap Filter, la requête a utilisé l'index.

  • Syntaxe prise en charge par Hologres V2.1 et versions ultérieures :

    CREATE TABLE bitmap_test (
        uid int NOT NULL,
        name text NOT NULL,
        gender text NOT NULL,
        class text NOT NULL,
        PRIMARY KEY (uid)
    )
    WITH (
        bitmap_columns = 'gender,class'
    );
    INSERT INTO bitmap_test VALUES 
    (1,'Bob','Male','Class 1'),
    (2,'Eric','Male','Class 3'),
    (3,'Ada','Female','Class 2'),
    (4,'Joyce','Female','Class 2'),
    (5,'Leo','Male','Class 2'),
    (6,'Steve','Male','Class 3'),
    (7,'Dora','Female','Class 1');
    explain SELECT * FROM bitmap_test where gender='Male' AND  class='Class 1';
  • Syntaxe prise en charge par toutes les versions :

    begin;
    create table bitmap_test (
      uid int not null,
      name text not null,
      gender text not null,
      class text not null,
      PRIMARY KEY (uid)
    );
    call set_table_property('bitmap_test', 'bitmap_columns', 'gender,class');
    commit;
    INSERT INTO bitmap_test VALUES
    (1,'Bob','Male','Class 1'),
    (2,'Eric','Male','Class 3'),
    (3,'Ada','Female','Class 2'),
    (4,'Joyce','Female','Class 2'),
    (5,'Leo','Male','Class 2'),
    (6,'Steve','Male','Class 3'),
    (7,'Dora','Female','Class 1');
    explain SELECT * FROM bitmap_test where gender='Male' AND  class='Class 1';

La présence de l'opérateur Bitmap Filter dans le plan d'exécution, tel que Bitmap Filter: (gender = 'Male'::text) AND (class = 'Class 1'::text), confirme que la requête a utilisé l'index bitmap.

Index bitmap vs clé de clustering

  • Les index bitmap et les clés de clustering filtrent tous deux les données au sein des fichiers.

  • Les index bitmap sont idéaux pour les requêtes d'égalité, car ils localisent les données par numéro de ligne. En revanche, les clés de clustering trient les données au sein des fichiers, ce qui les rend plus adaptées aux requêtes de plage.

    Une clé de clustering possède une priorité supérieure à celle d'un index bitmap. Si les deux sont créés sur la même colonne, l'optimiseur privilégie la clé de clustering. L'exemple suivant illustre ces détails :

    • Syntaxe prise en charge par Hologres V2.1 et versions ultérieures :

      -- The uid, class, and date columns are set as the clustering key.
      -- By default, text columns such as name, class, and date have bitmap indexes.
      CREATE TABLE ck_bit_test (
          uid int NOT NULL,
          name text NOT NULL,
          class text NOT NULL,
          date text NOT NULL,
          PRIMARY KEY (uid)
      )
      WITH (
          clustering_key = 'uid,class,date',
          bitmap_columns = 'name,class,date'
      );
      INSERT INTO ck_bit_test VALUES 
      (1,'Bob','1','2022-10-19'),
      (2,'Eric','3','2022-10-19'),
      (3,'Ada','2','2022-10-20'),
      (4,'Joyce','2','2022-10-20'),
      (5,'Leo','2','2022-10-18'),
      (6,'Steve','3','2022-10-17'),
      (7,'Dora','3','2022-10-20');
    • Syntaxe prise en charge par toutes les versions :

      -- The uid, class, and date columns are set as the clustering key.
      -- By default, text columns such as name, class, and date have bitmap indexes.
      begin;
      create table ck_bit_test (
        uid int not null,
        name text not null,
        class text not null,
        date text not null,
        PRIMARY KEY (uid)
      );
      call set_table_property('ck_bit_test', 'clustering_key', 'uid,class,date');
      call set_table_property('ck_bit_test', 'bitmap_columns', 'name,class,date');
      commit;
      INSERT INTO ck_bit_test VALUES
      (1,'Bob','1','2022-10-19'),
      (2,'Eric','3','2022-10-19'),
      (3,'Ada','2','2022-10-20'),
      (4,'Joyce','2','2022-10-20'),
      (5,'Leo','2','2022-10-18'),
      (6,'Steve','3','2022-10-17'),
      (7,'Dora','3','2022-10-20');
    • Cette requête d'égalité cible les colonnes uid,class,date . Comme elle suit le principe de correspondance le plus à gauche, l'optimiseur utilise la clé de clustering plutôt que l'index bitmap.

      SELECT * FROM ck_bit_test WHERE uid = '3' AND class ='2' AND date > '2022-10-17';

      Le plan d'exécution contient l'opérateur Cluster Filter , mais pas l'opérateur Bitmap Filter , ce qui indique que la requête a utilisé la clé de clustering. Le plan affiche un élément Index Scan using holo_index:[1] on ck_bit_test et filtre à l'aide de Cluster Filter: ((uid = 3) AND (class = '2'::text) AND (date > '2022-10-17'::text)) , ce qui confirme l'utilisation de la clé de clustering.

    • La requête est effectuée sur les colonnes uid,class,date . Cependant, la colonne class est utilisée dans une requête de plage. Selon le principe de correspondance le plus à gauche, la correspondance s'arrête si > ou < est utilisé dans une requête SQL. Par conséquent, le prédicat sur la colonne date ne peut pas utiliser la clé de clustering. Étant donné qu'un index bitmap existe sur la colonne date , la requête l'utilise à la place.

      SELECT * FROM ck_bit_test WHERE uid = '3' AND class >'2' AND date = '2022-10-17';

      Le plan d'exécution contient à la fois l'opérateur Cluster Filter et l'opérateur Bitmap Filter . Cela indique que la requête a utilisé la clé de clustering pour les colonnes uid,class et l'index bitmap pour la colonne date .

      explain SELECT * FROM ck_bit_test WHERE uid = '3' AND class >'2' AND date = '2022-10-17';
      QUERY PLAN
      Exchange (Gather Exchange)  (cost=0.00..1.10 rows=1 width=24)
        ->  Decode  (cost=0.00..1.10 rows=1 width=24)
              ->  Index Scan using holo_index:[1] on ck_bit_test  (cost=0.00..1.00 rows=1 width=24)
                    Cluster Filter: ((uid = 3) AND (class > '2'::text))
                    Bitmap Filter: (date = '2022-10-17'::text)
                    Shard Selector(Eagerly):
                      ->: l0 [3]
      Optimizer: HQO version 1.3.0

Exemples

  • Syntaxe prise en charge par Hologres V2.1 et versions ultérieures :

    CREATE TABLE tbl (
        a text NOT NULL,
        b text NOT NULL
    )
    WITH (
        bitmap_columns = 'a:on,b:off'
    );
    -- Modify bitmap_columns
    ALTER TABLE tbl SET (bitmap_columns = 'a:off');-- The ALTER TABLE statement supports only full modification.
  • Syntaxe prise en charge par toutes les versions :

    -- Create the tbl table and set a bitmap index.
    begin; 
    create table tbl (
      a text not null,
      b text not null
    );
    call set_table_property('tbl', 'bitmap_columns', 'a:on,b:off');
    commit;
    -- Modify the bitmap index.
    call set_table_property('tbl', 'bitmap_columns', 'a:off');-- Full modification, which disables the bitmap index for column a.
    call update_table_property('tbl', 'bitmap_columns', 'b:off');-- Incrementally modifies the property, disabling the bitmap index for column b while retaining the setting for column a.

Documents connexes

Les rubriques suivantes fournissent des informations complémentaires sur les instructions Data Definition Language (DDL) relatives aux tables internes dans Hologres :