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]}[,...]]');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ö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ızcaonveyaoffdeğerlerini destekler. Hologres V2.0 itibarıyla,bitmap_columnsözelliğiniautoolarak 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,datesü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 Filterişlecini içerir ancakBitmap Filterişlecini içermez; bu, sorgunun kümeleme anahtarını kullandığını gösterir. Plan,Index Scan using holo_index:[1] on ck_bit_testgösterir veCluster 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,datesütunlarında gerçekleştirilir. Ancak,classsü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,datesütunundaki yüklem kümeleme anahtarını kullanamaz.datesü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 Filterişlecini hem deBitmap Filterişlecini içerir. Bu, sorgununuid,classsütunları için kümeleme anahtarını vedatesü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: