Tüm Ürünler
Search
Belge Merkezi

Hologres:Bit eşlem dizini

Son Güncelleme:Oct 06, 2026

Bu konu, Hologres'te bit eşlem dizinlerinin nasıl kullanılacağını açıklar.

Genel bakış

Hologres'te bitmap_columns özelliği bir bit eşlem dizinini belirtir. Bit eşlem dizini, veri depolamadan bağımsız olan ve eşitlik sorgularını hızlandırmak için tasarlanmış ayrı bir dizin yapısıdır. Dosya blokları içindeki verileri hızlıca filtrelemek amacıyla bit eşlem vektörü kullanır; bu nedenle eşitlik filtreleme senaryoları için uygundur. Aşağıdaki sözdizimini kullanın:

-- 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]}[,...]]');


Parameter


Description


table_name


Tablonun adı.


columnName


Sütunun adı.


on


Belirtilen sütun için bit eşlem dizinini etkinleştirir.


off


Belirtilen sütun için bit eşlem dizinini devre dışı bırakır.

Öneriler

  • Eşitlik sorgularında sıkça kullanılan sütunlarda bit eşlem dizinleri oluşturun. Bu sayede sistem, eşleşen verilerin satır numaralarını hızla bulabilir. Ancak yüksek kardinaliteye sahip (yani tekrarlanan değeri az olan) sütunlarda bit eşlem dizini kullanmak önemli ölçüde depolama ek yüküne neden olabilir.

  • Her sütunda bit eşlem dizini oluşturmayın. Bu uygulama yalnızca ekstra depolama maliyeti getirmekle kalmaz, aynı zamanda Hologres'in veri alımı sırasında her sütun için bir dizin oluşturması gerektiğinden yazma aktarım hızını da düşürür.

  • JSON biçimli verileri tutan metin sütunlarında bit eşlem dizini oluşturmayın.

Sınırlamalar

  • Bit eşlem dizinleri, sütun odaklı ve satır-sütun hibrit tablolarında desteklenir ancak satır odaklı tablolarda desteklenmez.

  • Bit eşlem dizinine sahip sütunlar null değerler içerebilir.

  • Varsayılan olarak, text veri türündeki tüm sütunlarda bit eşlem dizinleri örtük olarak oluşturulur.

  • Bit eşlem dizinlerini ayarlamak için komutları işlem dışında çalıştırabilirsiniz. Değişiklikler hemen etkili olmaz çünkü Hologres bit eşlem kodlamalarının oluşturulmasını ve silinmesini arka planda eşzamansız olarak gerçekleştirir. Daha fazla bilgi için bkz. ALTER TABLE.

  • bitmap_columns özelliği yalnızca on veya off değerlerini destekler. Hologres V2.0 itibarıyla, bitmap_columns özelliğini auto olarak ayarlamak artık desteklenmemektedir.

Çalışma mantığı

Dağıtım anahtarı veya kümeleme anahtarından farklı olarak, bit eşlem dizini veri depolamadan bağımsız bir dizin yapısıdır. Bir sorgu bu dizini kullandığında, verileri filtrelemek için satır numarasını hızla bulabilir. Ancak bit eşlem dizinlerinin bir maliyeti vardır. Aşağıdaki senaryoları göz önünde bulundurun:

  • Yüksek kardinaliteli sütunlar: Hologres her farklı değer için bir bit eşlem oluşturur. Tekrarlanmayan değer sayısı çok fazlaysa, bu işlem büyük miktarda depolama alanı tüketen seyrek bir dizi oluşturur.

  • Geniş bir tablodaki tüm sütunların bit eşlem dizinlerine sahip olması: Geniş bir tabloda her sütun için bit eşlem dizini oluşturursanız, Hologres veri alımı sırasında her değer için bir bit eşlem oluşturmak zorunda kalır. Bu durum sistem ek yüküne yol açar ve yazma aktarım hızını düşürür.

Özetle, bit eşlem dizini alan-zaman takasıdır. Veri dağılımı nispeten dengeli olan sütunlar için en maliyet etkin çözümdür.位图索引

Aşağıdaki örnekte gösterildiği gibi, bir sorgunun bit eşlem dizini kullanıp kullanmadığını kontrol etmek için explain SQL kullanabilirsiniz. Yürütme planı Bitmap Filter içeriyorsa, sorgu dizini kullanmış demektir.

  • Hologres V2.1 ve sonraki sürümler tarafından desteklenen sözdizimi:

    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';
  • Tüm sürümler tarafından desteklenen sözdizimi:

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

Yürütme planında Bitmap Filter işlecinin bulunması (örneğin Bitmap Filter: (gender = 'Male'::text) AND (class = 'Class 1'::text)), sorgunun bit eşlem dizinini kullandığını doğrular.

Bit eşlem dizini ile kümeleme anahtarı karşılaştırması

  • Hem bit eşlem dizinleri hem de kümeleme anahtarları dosyalar içindeki verileri filtreler.

  • Bit eşlem dizinleri, verileri satır numarasına göre konumlandırdıkları için eşitlik sorguları için idealdir. Buna karşılık, kümeleme anahtarları dosyalar içindeki verileri sıralar; bu nedenle aralık sorguları için daha uygundur.

    Kümeleme anahtarının önceliği bit eşlem dizininden daha yüksektir. Aynı sütunda her ikisi de oluşturulursa, iyileştirici kümeleme anahtarını kullanmayı tercih eder. Aşağıdaki örnek ayrıntıları göstermektedir:

    • Hologres V2.1 ve sonraki sürümler tarafından desteklenen sözdizimi:

      -- 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');
    • Tüm sürümler tarafından desteklenen sözdizimi:

      -- 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');
    • Bu eşitlik sorgusu uid,class,date sütunlarını hedefler. Sol en eşleşme ilkesini izlediği için iyileştirici, bit eşlem dizini yerine kümeleme anahtarını kullanır.

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

      Yürütme planı Cluster Filter işlecini içerir ancak Bitmap Filter işlecini içermez; bu, sorgunun kümeleme anahtarını kullandığını gösterir. Plan, Index Scan using holo_index:[1] on ck_bit_test gösterir ve Cluster Filter: ((uid = 3) AND (class = '2'::text) AND (date > '2022-10-17'::text)) kullanarak filtreleme yapar; bu da kümeleme anahtarının kullanıldığını doğrular.

    • Sorgu uid,class,date sütunlarında gerçekleştirilir. Ancak, class sütunu bir aralık sorgusunda kullanılır. Sol en eşleşme ilkesine göre, bir SQL sorgusunda > veya < kullanıldığında eşleşme durur. Bu nedenle, date sütunundaki yüklem kümeleme anahtarını kullanamaz. date sütununda bir bit eşlem dizini bulunduğundan, sorgu bunun yerine bunu kullanır.

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

      Yürütme planı hem Cluster Filter işlecini hem de Bitmap Filter işlecini içerir. Bu, sorgunun uid,class sütunları için kümeleme anahtarını ve date sütunu için bit eşlem dizinini kullandığını gösterir.

      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

Örnekler

  • Hologres V2.1 ve sonraki sürümler tarafından desteklenen sözdizimi:

    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.
  • Tüm sürümler tarafından desteklenen sözdizimi:

    -- 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.

İlgili belgeler

Aşağıdaki konular, Hologres'teki dahili tablolar için Veri Tanımlama Dili (DDL) deyimleri hakkında daha fazla bilgi sağlar: