Tüm Ürünler
Search
Belge Merkezi

ApsaraDB for SelectDB:Bloom filtre dizinleri

Son Güncelleme:Oct 07, 2026

Sorgular yüksek kardinaliteli sütunlarda IN veya = filtreleri kullandığında, ApsaraDB for SelectDB sorgulanan değeri içermeyen veri bloklarının tamamını atlayabilir. Bloom filtre dizinleri, blok başına olasılıksal üyelik kontrolleri sağlayarak bu işlemi mümkün kılar ve seçici nokta arama sorguları için G/Ç yükünü önemli ölçüde azaltır.

Çalışma mantığı

Bloom filtresi, Burton Howard Bloom tarafından 1970 yılında icat edilen olasılıksal bir veri yapısıdır. Bir bit dizisi ve bir dizi karma işlevinden oluşur. Başlangıçta tüm bitler 0 olarak ayarlanır. Bir değer dizine eklendiğinde, her karma işlevi değeri bir bit konumuna eşler ve bu konum 1 olarak ayarlanır.

Sorgu sırasında aynı karma işlevleri sorgu değerine uygulanır:

  • Elde edilen bit konumlarından herhangi biri 0 ise, değer blokta kesinlikle yoktur. Blok atlanır.

  • Elde edilen tüm bit konumları 1 ise, değer blokta olabilir (yanlış pozitifler mümkündür). Blok okunur.

SelectDB'deki Bloom filtre dizinleri blok başına oluşturulur. Her blok için, dizine eklenen sütundaki değerler Bloom filtre kümesini oluşturur.

Aşağıdaki diyagram, m = 18 bit ve k = 3 karma işlevine sahip bir Bloom filtresini gösterir. x, y ve z öğeleri bit dizisine eşlenir. w öğesi sorgulandığında, karma konumlarından biri 0 bitine eşlendiği için w'nin bu blokta olmadığı doğrulanır.

Bloom_filter.svg

Sınırlamalar

Bloom filtre dizinlerinin aşağıdaki sınırlamaları vardır:
Desteklenmeyen operatörler: Dizin yalnızca IN ve = filtre koşullarını hızlandırır. Diğer operatörler hızlandırılmaz.
Desteklenmeyen veri türleri: TINYINT , FLOAT veya DOUBLE türündeki sütunlarda dizin oluşturulamaz.
Düşük kardinaliteli sütunlar: Az sayıda farklı değere sahip sütunları dizinlemekten kaçının. Örneğin, yalnızca iki değere sahip bir cinsiyet sütunu neredeyse her blokta görüneceğinden dizin hiçbir şeyi filtrelemez ve gereksiz ek yük oluşturur. Bir sorgunun Bloom filtre dizini kullandığını doğrulamak için sorgu profilini açın ve Bloom filtre ile ilgili ölçümleri kontrol edin.

Dizin oluşturma

Bloom filtre dizinleri, tablonun PROPERTIES bölümünde bloom_filter_columns aracılığıyla belirtilir.

Tablo oluşturma sırasında dizin oluşturma

CREATE TABLE deyiminizin PROPERTIES yan tümcesine virgülle ayrılmış sütun adlarını içeren "bloom_filter_columns"="<col1>,<col2>" ifadesini ekleyin.

Aşağıdaki örnek, sale_detail_bloom tablosunda saler_id ve category_id için Bloom filtre dizinleri oluşturur:

CREATE TABLE IF NOT EXISTS sale_detail_bloom(
    sale_date date NOT NULL COMMENT "The date on which the product was sold",
    customer_id int NOT NULL COMMENT "The ID of the customer",
    saler_id int NOT NULL COMMENT "The ID of the seller",
    sku_id int NOT NULL COMMENT "The ID of the product",
    category_id int NOT NULL COMMENT "The ID of the category to which the product belongs",
    sale_count int NOT NULL COMMENT "The number of products that were sold",
    sale_price DECIMAL(12,2) NOT NULL COMMENT "The unit price of the product",
    sale_amt DECIMAL(20,2) COMMENT "The total sales amount"
)
Duplicate KEY(sale_date, customer_id, saler_id, sku_id, category_id)
distributed BY hash(customer_id) buckets 3
PROPERTIES("bloom_filter_columns"="saler_id, category_id");

Mevcut bir tabloya dizin ekleme

Mevcut bir tablo için bloom_filter_columns değerini güncellemek amacıyla ALTER TABLE ... SET komutunu çalıştırın. k1,k3 ifadelerini dizinlenecek sütunlarla değiştirin:

ALTER TABLE <db.table_name> SET ("bloom_filter_columns" = "k1,k3");

Dizin değişiklikleri eşzamansız olarak uygulanır. İlerlemeyi izlemek için şu komutu çalıştırın:

SHOW ALTER TABLE COLUMN;

Dizini görüntüleme

Bir tablo için tanımlanmış Bloom filtre sütunlarını görmek üzere SHOW CREATE TABLE komutunu çalıştırın:

SHOW CREATE TABLE <table_name>;

Örnek — sale_detail_bloom için dizin yapılandırmasını görüntüleyin:

SHOW CREATE TABLE sale_detail_bloom;

Çıktı, PROPERTIES bloğundaki bloom_filter_columns özelliğini gösterir:

+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table             | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sale_detail_bloom | CREATE TABLE `sale_detail_bloom` (
  `sale_date` datev2 NOT NULL COMMENT 'The date on which the product was sold',
  `customer_id` int(11) NOT NULL COMMENT 'The ID of the customer',
  `saler_id` int(11) NOT NULL COMMENT 'The ID of the seller',
  `sku_id` int(11) NOT NULL COMMENT 'The ID of the product',
  `category_id` int(11) NOT NULL COMMENT 'The ID of the category to which the product belongs',
  `sale_count` int(11) NOT NULL COMMENT 'The number of products that were sold',
  `sale_price` decimalv3(12, 2) NOT NULL COMMENT 'The unit price of the product',
  `sale_amt` decimalv3(20, 2) NULL COMMENT 'The total sales amount'
) ENGINE=OLAP
DUPLICATE KEY(`sale_date`, `customer_id`, `saler_id`, `sku_id`, `category_id`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`customer_id`) BUCKETS 3
PROPERTIES (
"bloom_filter_columns" = "category_id, saler_id",
"light_schema_change" = "true"
);                               |
+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)

Dizini silme

Bir tablodan Bloom filtre dizinlerini kaldırmak için bloom_filter_columns değerini boş bir dizeye ayarlayın:

ALTER TABLE <db.table_name> SET ("bloom_filter_columns" = "");

Dizin oluşturma, değiştirme ve silme işlemleri eşzamansız olarak uygulanır. İlerlemeyi izlemek için şu komutu çalıştırın:

SHOW ALTER TABLE COLUMN;

En iyi uygulamalar

Bir Bloom filtre dizini, aşağıdaki üç koşulun da karşılanması durumunda en etkili sonucu verir:

  • Sütun, birincil sıralama anahtarı değildir (ön ek tabanlı filtreleme bu durumu ele alır).

  • Sütun üzerindeki sorgular sıklıkla IN veya = filtre koşullarını kullanır.

  • Sütun yüksek kardinaliteye sahiptir; yani blok başına satır sayısına kıyasla çok sayıda farklı değere sahiptir (kullanıcı kimlikleri veya sipariş numaraları gibi).

When not to use a Bloom filter index: Bir sütun düşük kardinaliteye sahipse (örneğin, active ve inactive gibi değerlere sahip bir durum sütunu), her blok muhtemelen her iki değeri de içerir. Dizin hiçbir şeyi filtrelemez ancak her sorguda hesaplama maliyeti oluşturur. Bu durumda Bloom filtre dizini performansa yardımcı olmak yerine zarar verir.