全部产品
Search
文档中心

Hologres:Indeks Bitmap

更新时间:Jul 02, 2025

Topik ini menjelaskan cara menggunakan indeks bitmap di Hologres.

Ikhtisar

Di Hologres, properti bitmap_columns menentukan indeks bitmap. Properti ini menggunakan skema indeks yang independen dari penyimpanan data. Anda dapat memanfaatkan properti bitmap_columns untuk mempercepat perbandingan ekuivalen berdasarkan struktur vektor bitmap. Indeks bitmap membantu menyaring data dengan nilai tertentu dalam file yang disimpan, sehingga cocok untuk kueri titik. Berikut adalah sintaksis untuk menetapkan indeks bitmap:

-- Sintaksis yang didukung oleh Hologres V2.1 dan yang lebih baru
CREATE TABLE <table_name> (...) WITH (bitmap_columns = '[<columnName>{:[on|off]}[,...]]');

-- Sintaksis yang didukung oleh semua versi Hologres
CREATE TABLE <table_name> (...);
CALL set_table_property('<table_name>', 'bitmap_columns', '[<columnName>{:[on|off]}[,...]]');

Parameter

Deskripsi

table_name

Nama tabel.

columnName

Nama kolom.

on

Menunjukkan bahwa indeks bitmap dibuat untuk kolom saat ini.

off

Menunjukkan bahwa tidak ada indeks bitmap yang dibuat untuk kolom saat ini.

Catatan Penggunaan

  • Disarankan untuk menentukan indeks bitmap pada kolom kueri ekuivalen agar Hologres dapat dengan cepat menemukan nomor baris tempat data yang memenuhi kondisi filter berada. Namun, jika indeks bitmap ditentukan untuk kolom dengan kardinalitas tinggi, akan terjadi overhead penyimpanan tambahan karena kolom tersebut mengandung lebih sedikit data duplikat.

  • Hindari menentukan indeks bitmap untuk setiap kolom dalam tabel, karena hal ini dapat meningkatkan overhead penyimpanan dan memengaruhi kinerja penulisan.

  • Jangan membuat indeks bitmap untuk kolom yang menyimpan data berformat JSON sebagai tipe data TEXT.

Batasan

  • Hanya tabel berorientasi kolom dan tabel hibrid baris-kolom yang mendukung indeks bitmap. Tabel berorientasi baris tidak mendukung indeks bitmap.

  • Kolom yang ditentukan oleh properti bitmap_columns dapat bernilai null.

  • Secara default, semua kolom dengan tipe data TEXT dalam tabel berorientasi kolom ditentukan sebagai kolom indeks bitmap.

  • Anda dapat mengeksekusi pernyataan untuk memodifikasi kolom indeks bitmap di luar blok transaksi. Kolom yang dimodifikasi tidak langsung berlaku karena indeks bitmap dibangun dan dihapus secara asinkron di backend. Untuk informasi lebih lanjut, lihat ALTER TABLE.

  • Anda hanya dapat mengatur bitmap_columns ke on atau off. Nilai auto tidak valid untuk bitmap_columns di Hologres V2.0 dan versi yang lebih baru.

Cara Kerjanya

Indeks bitmap berbeda dari kunci distribusi dan kunci pengelompokan serta independen dari penyimpanan data. Setelah menentukan indeks bitmap untuk kolom, Hologres menghasilkan string biner untuk nilai dalam kolom tersebut. String biner sesuai dengan nilai dalam kolom indeks bitmap. Jika kueri mengenai indeks bitmap, Hologres dengan cepat menemukan nomor baris tempat data berada. Namun, indeks bitmap tetap mengakibatkan overhead. Perhatikan hal-hal berikut:

  • Jika kolom dengan kardinalitas tinggi ada dalam tabel, Hologres menghasilkan string biner untuk nilai dalam kolom tersebut. Jika banyak nilai berbeda terlibat, larik jarang dihasilkan dan sejumlah besar sumber daya penyimpanan dikonsumsi.

  • Jika indeks bitmap ditentukan untuk setiap kolom dalam tabel lebar, Hologres menghasilkan string biner untuk setiap nilai dalam kolom saat data ditulis. Hal ini menyebabkan overhead sistem yang memengaruhi kinerja penulisan.

Secara keseluruhan, indeks bitmap dapat digunakan untuk mengurangi waktu kueri data dengan biaya penyimpanan. Indeks bitmap hemat biaya untuk kolom di mana data didistribusikan secara merata.位图索引

Contoh berikut menunjukkan cara menggunakan pernyataan EXPLAIN untuk memeriksa apakah kueri mengenai indeks bitmap. Jika rencana eksekusi berisi operator Bitmap Filter, kueri mengenai indeks bitmap.

  • Sintaksis yang didukung oleh Hologres V2.1 dan yang lebih baru:

    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';
  • Sintaksis yang didukung oleh semua versi Hologres:

    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';

rencana eksekusi berisi operator Bitmap Filter. Ini menunjukkan bahwa kueri mengenai indeks bitmap.

Perbedaan antara indeks bitmap dan kunci pengelompokan

  • Kesamaan:

    Indeks bitmap dan kunci pengelompokan digunakan untuk menyaring data dalam file.

  • Perbedaan:

    Indeks bitmap digunakan untuk menemukan data menggunakan nomor file, sehingga lebih cocok untuk kueri ekuivalen. Kunci pengelompokan digunakan untuk mengurutkan data dalam file, sehingga lebih cocok untuk kueri rentang.

    Dibandingkan dengan indeks bitmap, kunci pengelompokan memiliki prioritas lebih tinggi. Jika Anda menentukan kunci pengelompokan dan indeks bitmap untuk kolom yang sama, pengoptimal kueri secara preferensial menggunakan kunci pengelompokan untuk mencocokkan file. Pernyataan berikut memberikan contoh:

    • Sintaksis yang didukung oleh Hologres V2.1 dan yang lebih baru:

      -- Tentukan kolom uid, class, dan date sebagai kunci pengelompokan dan kolom teks sebagai indeks bitmap.
      
      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');
    • Sintaksis yang didukung oleh semua versi Hologres:

      -- -- Tentukan kolom uid, class, dan date sebagai kunci pengelompokan dan kolom teks sebagai indeks bitmap.
      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');
    • Jika Anda menanyakan kolom uid, class, dan date, pernyataan kueri SQL mematuhi prinsip pencocokan paling kiri, dan kueri mengenai kunci pengelompokan. Kunci pengelompokan alih-alih indeks bitmap digunakan bahkan dalam kueri ekuivalen.

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

      Gambar berikut menunjukkan bahwa rencana eksekusi berisi operator Cluster Filter alih-alih operator Bitmap Filter. Ini menunjukkan bahwa kunci pengelompokan alih-alih indeks bitmap digunakan dalam kueri.执行计划2

    • Jika Anda menanyakan kolom uid, class, dan date dan kueri kolom class adalah kueri rentang, prinsip pencocokan paling kiri tidak berfungsi selama kueri setelah data dalam rentang yang ditentukan dalam pernyataan SQL cocok. Dalam hal ini, kueri kolom date tidak dapat mengenai kunci pengelompokan karena pernyataan kueri tidak mengikuti prinsip pencocokan paling kiri. Jika Anda menentukan indeks bitmap untuk kolom date, indeks bitmap digunakan dalam kueri.

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

      Gambar berikut menunjukkan bahwa rencana eksekusi berisi operator Cluster Filter dan operator Bitmap Filter. Ini menunjukkan bahwa kunci pengelompokan digunakan dalam kueri kolom uid dan class dan bahwa indeks bitmap digunakan dalam kueri kolom date.执行计划3

Contoh

  • Sintaksis yang didukung oleh Hologres V2.1 dan yang lebih baru:

    CREATE TABLE tbl (
        a text NOT NULL,
        b text NOT NULL
    )
    WITH (
        bitmap_columns = 'a:on,b:off'
    );
    
    -- Modifikasi properti bitmap_columns.
    ALTER TABLE tbl SET (bitmap_columns = 'a:off');-- Pernyataan ALTER TABLE mendukung modifikasi properti bitmap_columns hanya untuk semua kolom.
  • Sintaksis yang didukung oleh semua versi Hologres:

    // Buat tabel bernama tbl dan atur indeks bitmap.
    begin; create table tbl (
      a text not null,
      b text not null
    );
    call set_table_property('tbl', 'bitmap_columns', 'a:on,b:off');
    commit;
    
    
    -- Modifikasi indeks bitmap.
    call set_table_property('tbl', 'bitmap_columns', 'a:off');-- Modifikasi properti bitmap_columns untuk semua kolom. Hapus indeks bitmap yang ditentukan untuk Kolom a.
    call update_table_property('tbl', 'bitmap_columns', 'b:off');-- Modifikasi properti bitmap_columns untuk Kolom b. Hapus indeks bitmap yang ditentukan untuk Kolom b dan pertahankan indeks bitmap yang ditentukan untuk Kolom a.

Referensi

Untuk informasi lebih lanjut tentang pernyataan DDL untuk tabel internal Hologres, lihat topik-topik berikut: