Tüm Ürünler
Search
Belge Merkezi

ApsaraDB for SelectDB:Çalışma zamanı filtresi

Son Güncelleme:Oct 08, 2026

Çalışma zamanı filtreleri, hash join işlemi çalışmadan önce sol tabloyu daraltarak join sorgularının süresini kısaltır. ApsaraDB for SelectDB, her satırı taramak yerine sağ tablodan yola çıkarak çalışma zamanında bir filtre oluşturur ve bunu tarama katmanına iter; böylece join işlemine yalnızca eşleşen satırlar girer.

Çalışma zamanı filtreleri varsayılan olarak etkindir. ApsaraDB for SelectDB, sorguya ve tablo istatistiklerine dayanarak otomatik olarak IN yüklemeleri ve bloom filtreleri oluşturur. Belirli sorgular için davranışı ayarlamak amacıyla oturum değişkenlerini kullanın.

Nasıl çalışır?

Hash join işleminde, önce hash tablosunu oluşturmak için sağ tablo yüklenir. Bir çalışma zamanı filtresi, bu hash tablosundaki anahtar değerleri yakalar ve filtreyi sol tabloyu tarayan OlapScanNode düğümüne gönderir. OlapScanNode, eşleşmeyen satırları HashJoinNode düğümüne ulaşmadan önce atar.

Aşağıdaki örnekte iki tablo kullanılmaktadır: T1 (1.000.000 satırlık bir fact tablosu) ve T2 (200 satırlık bir dimension tablosu).

Çalışma zamanı filtresi olmadan — T1'deki 1.000.000 satırın tamamı join işlemine akar:

HashJoinNode
     |                    |
     | 1,000,000          | 200
     |                    |
OlapScanNode         OlapScanNode
     ^                    ^
     | 1,000,000          | 200
    T1 (fact)            T2 (dimension)

Filtre tarama katmanında uygulandığında — join işlemine yalnızca 6.000 satır ulaşır:

HashJoinNode
     |                    |
     | 6,000              | 200
     |                    |
OlapScanNode         OlapScanNode
     ^                    ^
     | 1,000,000          | 200
    T1 (fact)            T2 (dimension)

Filtre depolama motoruna daha da derinlere itildiğinde — dizinler veriler okunmadan önce elenir:

HashJoinNode
     |                    |
     | 6,000              | 200
     |                    |
OlapScanNode         OlapScanNode
     ^                    ^
     | 6,000              | 200
    T1 (fact)            T2 (dimension)

Yükleme itme (predicate pushdown) veya bölüm eleme yöntemlerinden farklı olarak, filtre koşulu sorgu planlama aşamasında bilinmez. Koşul, yürütme sırasında sağ tablodaki gerçek verilerden hesaplanır ve ardından sol tabloyu okuyan OlapScanNode düğümüne yayınlanır.

Temel kavramlar

Sol tablo — Join işleminin sol tarafında yer alan tablo; probe işlemi için kullanılır. Join yeniden sıralama, hangi tablonun hangi tarafta olacağını değiştirebilir.

Sağ tablo — Join işleminin sağ tarafında yer alan tablo; hash tablosunu oluşturmak için kullanılır. Join yeniden sıralama bu durumu da değiştirebilir.

Parça (Fragment) — Sorgu yürütme birimi. Frontend (FE) düğümü, bir SQL ifadesini parçalara böler ve bunları dağıtılmış kümedeki backend (BE) düğümlerine dağıtır.

Çalışma zamanı filtrelerinin yararlı olduğu durumlar

Çalışma zamanı filtreleri aşağıdaki durumlarda en etkili sonucu verir:

  • Sol tablo, sağ tablodan önemli ölçüde daha büyükse. Filtre oluşturmanın bellek ve hesaplama maliyeti vardır; bu maliyet yalnızca büyük ölçeklerde telafi edilir.

  • Join sonucu, sol tablodan çok daha küçükse; bu durum, filtrenin sol tablodaki satırların çoğunu atabileceği anlamına gelir.

Sağ tablo büyükse veya join sonucu sol tabloyla neredeyse aynı büyüklükteyse, çalışma zamanı filtreleri herhangi bir fayda sağlamadan ek yük getirebilir.

Filtre türleri

ApsaraDB for SelectDB beş tür çalışma zamanı filtresini destekler:

Tür Nasıl çalışır? En uygun olduğu durum Sınırlamalar
IN yüklemesi Sağ tablodaki tüm anahtar değerlerden oluşan bir HashSet oluşturur; sol tabloyu IN ile filtreler Broadcast joinlerdeki küçük sağ tablolar Yalnızca broadcast joinlerde çalışır; sağ tablo satırları runtime_filter_max_in_num değerini (varsayılan: 1.024) aştığında geçersiz hale gelir
Bloom filtresi Hash tablosundan olasılıksal bir yapı oluşturur; düşük yanlış pozitif oranına sahiptir Büyük sağ tablolar, çoğu veri türü Oluşturma ve uygulama yükü daha yüksektir; filtreleme oranı düşükse veya sol tablo küçükse performansı düşürebilir
MinMax filtresi Sağ tablodan min/maks aralığını çıkarır; bu aralığın dışındaki satırları filtreler Çakışmayan aralıklara sahip sayısal anahtar sütunlar Sayısal olmayan sütunlarda (örn. VARCHAR) etkisizdir; aralıklar tamamen çakıştığında fayda sağlamaz
IN_OR_BLOOM_FILTER Çalışma zamanında sağ tablo satır sayısına göre otomatik olarak IN yüklemesi veya bloom filtresi seçer Genel amaçlı kullanım (varsayılan) Eşik değeri runtime_filter_max_in_num tarafından kontrol edilir; 102.400 satırın altında IN, üzerinde bloom filtresi kullanır
Bitmap filtresi Bir IN alt sorgusundan döndürülen bitmap sütununu kullanarak filtreleme yapar Bitmap IN alt sorguları içeren sorgular Yalnızca vektörleştirilmiş motorda desteklenir

Çalışma zamanı filtrelerini yapılandırma

Belirli sorgular için çalışma zamanı filtresi davranışını ayarlamak üzere aşağıdaki oturum değişkenlerini kullanın.

Parametreler

Parametre Varsayılan Açıklama
runtime_filter_mode GLOBAL Filtrelerin yürütme parçaları arasında ne kadar yayılacağını kontrol eder. Değerler: OFF, LOCAL, GLOBAL.
runtime_filter_type IN_OR_BLOOM_FILTER Oluşturulacak filtre tür(ler)i. Değerler: IN, BLOOM_FILTER, MIN_MAX, IN_OR_BLOOM_FILTER, BITMAP_FILTER. Virgülle birleştirin.
runtime_filter_wait_time_ms 1000 OlapScanNode'un taramaya başlamadan önce bekleyeceği maksimum süre (ms). Filtre başına uygulanır: üç filtre toplamda en fazla 3.000 ms bekleme süresi demektir.
runtime_filters_max_num 10 Sorgu başına maksimum bloom filtresi sayısı. Sınır aşıldığında daha yüksek seçiciliğe sahip bloom filtreleri korunur.
runtime_bloom_filter_min_size 1048576 (1 MiB) Minimum bloom filtresi boyutu (bayt cinsinden).
runtime_bloom_filter_max_size 16777216 (16 MiB) Maksimum bloom filtresi boyutu (bayt cinsinden).
runtime_bloom_filter_size 2097152 (2 MiB) Sağ tablo kardinalitesi mevcut olmadığında kullanılan varsayılan bloom filtresi boyutu.
runtime_filter_max_in_num 1024 IN yüklemesi oluşturulmayacak olan satır sayısı eşiği. Ayrıca IN_OR_BLOOM_FILTER modunda IN ile bloom filtresi arasındaki geçişi kontrol eder (eşik: 102.400).

runtime_filter_mode

Sorgu yürütme parçaları arasında filtre yayılımının kapsamını kontrol eder.

  • **LOCAL** — Filtre üreticisi (HashJoinNode) ve tüketici (OlapScanNode) aynı parçada olmalıdır. Broadcast joinler için uygundur. Daha düşük ek yük sunar.

  • **GLOBAL** — Filtreler birleştirilir ve ağ üzerinden parça sınırları arasında aktarılır. Üretici ve tüketicinin farklı parçalarda bulunduğu shuffle joinler için gereklidir.

GLOBAL modu, LOCAL modunun işlediği tüm senaryoların yanı sıra shuffle joinleri de kapsar. Belirli bir shuffle join için filtreleri birleştirip iletmenin ek yükü, tarama tasarrufundan daha fazlaysa LOCAL moduna geçin. Çalışma zamanı filtrelerini tamamen devre dışı bırakmak için OFF olarak ayarlayın.

Parçalar arası filtre birleştirme teknik tasarımı için bkz. ISSUE 6116.

runtime_filter_type

Bir tür belirtin veya birden çok türü birleştirin:

-- By name (comma-separated, quoted)
SET runtime_filter_type = "BLOOM_FILTER,IN,MIN_MAX";

-- Equivalent numeric form (1=IN, 2=BLOOM_FILTER, 4=MIN_MAX)
SET runtime_filter_type = 7;

IN yüklemesi davranışı:

  • Dağıtılmış yürütme için bir birleştirme stratejisi kullanır.

  • Hem IN hem de diğer filtre türleri belirtildiğinde ve sağ tablo runtime_filter_max_in_num sınırı içinde kaldığında, sistem diğer filtreleri atar. IN yüklemesi kesin sonuç verdiği için ek filtreler fayda sağlamaz. Bu optimizasyon yalnızca üretici ve tüketici aynı parçada olduğunda uygulanır.

Bloom filtresi davranışı:

  • Sıfırdan farklı bir yanlış pozitif oranına sahiptir; yani eşleşmeyen bazı satırları geçirebilir. Sonuçlar doğru kalır; yalnızca filtreleme verimliliği etkilenir.

  • Depolama motoruna itilebilir ancak yalnızca sol tablodaki anahtar sütunlar için geçerlidir. Depolama katmanı itmesi olmadan performans genellikle düşer.

  • Düşük seçiciliğe sahip sütunlarda veya küçük sol tablolarda bloom filtreleri kullanmaktan kaçının.

MinMax filtresi davranışı:

  • Sağ ve sol tabloların değer aralıkları çakışmadığında en etkilidir (örn. sağ tablonun maksimum değeri sol tablonun minimum değerinden düşükse veya tam tersi).

  • Sayısal sütunlarda (INT, BIGINT, DOUBLE), çakışan aralıklar etkinliği sıfıra indirir.

  • Sayısal olmayan sütunlarda (VARCHAR) genellikle performansı düşürür.

IN_OR_BLOOM_FILTER davranışı:

  • Sağ tablo satırları < 102.400 ise IN yüklemesini kullanır; bu eşiğin üzerinde bloom filtresine geçer.

  • Eşiği runtime_filter_max_in_num parametresiyle ayarlayın.

Bitmap filtresi davranışı:

  • Yalnızca IN alt sorgusu bir bitmap sütunu döndürdüğünde uygulanabilir.

  • Vektörleştirilmiş motor gerektirir.

runtime_filter_wait_time_ms

OlapScanNode, taramaya başlamadan önce atanmış her bir çalışma zamanı filtresi için bu süreye kadar bekler. Üç filtre varsa, maksimum bekleme süresi bu değerin üç katıdır.

Bekleme penceresi içinde gelen filtreler depolama motoruna itilir. Tarama başladıktan sonra gelen filtreler, zaten taranmış veriler üzerinde ifade filtreleri olarak uygulanır; bu yöntem etkilidir ancak depolama katmanı itmesinden daha az verimlidir.

Ayarlama rehberi:

  • Uzun süren joinler çalıştıran yoğun kümeler — Tarama başlamadan önce filtrelerin oluşturulup iletilmesi için yeterli zaman tanımak amacıyla bu değeri artırın.

  • Çok sayıda küçük sorgu çalıştıran hafif yükteki kümeler — Saniyeler içinde tamamlanan sorgulara gereksiz gecikme eklememek için bu değeri azaltın.

Küme yoğunsa ve kümede birçok kaynak yoğun veya zaman alıcı sorgu yürütülüyorsa, karmaşık sorguların optimizasyon fırsatlarını kaçırmamasını önlemek için bekleme süresini uzatabilirsiniz. Küme yükü hafifse ve kümede yalnızca birkaç saniye süren birçok küçük sorgu yürütülüyorsa, her sorgu için 1 sn'lik gecikme artışını önlemek amacıyla bekleme süresini azaltabilirsiniz.

runtime_filters_max_num

Sorgu başına bloom filtresi sayısını sınırlar. IN yüklemeleri ve MinMax filtreleri sayıma dahil edilmez.

Sınır aşıldığında, sistem daha yüksek seçiciliğe sahip (yani daha fazla satır elmesi beklenen) bloom filtrelerini korur:

Selectivity = HashJoinNode cardinality / HashJoinNode left child cardinality
Not

FE tarafından tahmin edilen kardinalite yanlış olabilir, bu nedenle seçicilik tabanlı sıralama gerçek filtreleme etkinliğini mükemmel şekilde yansıtmayabilir.

Bu parametreyi yalnızca büyük tablolar arasındaki yavaş join sorgularını ayarlarken değiştirin.

Bloom filtresi boyutu parametreleri

FE, sorgu planlama zamanında bloom filtresi uzunluğunu hesaplar. Bir sorgudaki tüm HashJoinNode bloom filtreleri, birleştirilebilmeleri için aynı uzunlukta olmalıdır.

  • Sağ tablo kardinalitesi istatistiklerde mevcutsa, FE optimal boyutu tahmin eder ve en yakın 2'nin katına yukarı yuvarlar.

  • Kardinalite mevcut değilse, FE varsayılan olarak runtime_bloom_filter_size değerini kullanır.

  • runtime_bloom_filter_min_size ve runtime_bloom_filter_max_size parametreleri, tahminden bağımsız olarak nihai boyutu sınırlar.

Daha büyük bloom filtreleri, yüksek kardinaliteli sütunları daha doğru şekilde işler ancak daha fazla bellek tüketir. Yüksek kardinaliteli bir sütun (milyonlarca farklı değer) için filtreleme doğruluğu yetersizse, runtime_bloom_filter_size değerini artırın ve sonucu kıyaslayın.

Bloom filtresi boyutunu genel olarak değil, sorgu başına ayarlayın.

Çalışma zamanı filtrelerinin uygulandığını doğrulama

Sorgu planını görüntülemek ve filtrelerin beklenen sütunlarda oluşturulup tüketildiğini onaylamak için EXPLAIN komutunu çalıştırın.

  • Join tarafı (filtre oluşturuldu): runtime filters: RF000[in] <- table.column

  • Tarama tarafı (filtre uygulandı): runtime filters: RF000[in] -> table.column

Örnek:

CREATE TABLE test (t1 INT) DISTRIBUTED BY HASH (t1) BUCKETS 2;
INSERT INTO test VALUES (1), (2), (3), (4);

CREATE TABLE test2 (t2 INT) DISTRIBUTED BY HASH (t2) BUCKETS 2;
INSERT INTO test2 VALUES (3), (4), (5);

EXPLAIN SELECT t1 FROM test JOIN test2 WHERE test.t1 = test2.t2;
+-------------------------------------------------------------------+
| Explain String                                                    |
+-------------------------------------------------------------------+
| PLAN FRAGMENT 0                                                   |
|  OUTPUT EXPRS:`t1`                                                |
|                                                                   |
|   4:EXCHANGE                                                      |
|                                                                   |
| PLAN FRAGMENT 1                                                   |
|  OUTPUT EXPRS:                                                    |
|   PARTITION: HASH_PARTITIONED: `default_cluster:ssb`.`test`.`t1`  |
|                                                                   |
|   2:HASH JOIN                                                     |
|   |  join op: INNER JOIN (BUCKET_SHUFFLE)                         |
|   |  equal join conjunct: `test`.`t1` = `test2`.`t2`              |
|   |  runtime filters: RF000[in] <- `test2`.`t2`                   |
|   |                                                               |
|   |----3:EXCHANGE                                                 |
|   |                                                               |
|   0:OlapScanNode                                                  |
|      TABLE: test                                                  |
|      runtime filters: RF000[in] -> `test`.`t1`                    |
|                                                                   |
| PLAN FRAGMENT 2                                                   |
|  OUTPUT EXPRS:                                                    |
|   PARTITION: HASH_PARTITIONED: `default_cluster:ssb`.`test2`.`t2` |
|                                                                   |
|   1:OlapScanNode                                                  |
|      TABLE: test2                                                 |
+-------------------------------------------------------------------+

Join tarafı — PLAN FRAGMENT 1'deki 2:HASH JOIN düğümü, test2.t2 sütunundan bir IN yüklemesi (RF000) oluşturur. Değerler yalnızca çalışma zamanında bilinir.

Tarama tarafı — 0:OlapScanNode düğümü, satırlar join işlemine ulaşmadan önce test.t1 sütununu filtrelemek için RF000'i uygular.

Sorguyu çalıştırdığınızda [3, 4] sonucu döner; bu, yalnızca t1 = t2 koşulunu sağlayan iki satırdır.

Profil ile filtre etkinliğini kontrol etme:

Profil oluşturmayı etkinleştirin, ardından sorguyu çalıştırın:

SET enable_profile = true;

Profilde, OLAP_SCAN_NODE altındaki RuntimeFilter bölümünü arayın:

RuntimeFilter:in:
    HasPushDownToEngine: true    -- filter reached the storage engine
    AWaitTimeCost: 0ns           -- no wait; filter arrived before scan started
    EffectTimeCost: 2.76ms       -- time spent applying the filter

Ve filtreleme sonucu:

RowsVectorPredFiltered: 9,320,008   -- rows discarded by the filter
VectorPredEvalTime: 364.39ms        -- time spent on filter evaluation

Yüksek bir RowsVectorPredFiltered sayısı, filtrenin etkili olduğunu doğrular. HasPushDownToEngine: true değeri, filtrenin depolama katmanına ulaştığını gösterir.

Planlama kuralları

Çalışma zamanı filtreleri aşağıdaki kurallara göre oluşturulur ve uygulanır. Bu kurallara uyulmaması, filtrelerin atlanmasına veya hatalı sonuçlar üretilmesine neden olur.

Oluşturma kuralları:

  • Filtreler yalnızca JOIN ON yan tümcelerindeki eşitlik koşulları için oluşturulur. NULL güvenli eşitlik (<=>) hariç tutulur çünkü sol tablodaki null değerler yanlışlıkla filtrelenebilir.

  • Kaynak ifade türü HLL veya BITMAP olamaz.

  • Kaynak ve hedef ifadeler sabit (constant) olamaz.

  • Kaynak ve hedef ifadeler aynı ifade olamaz.

  • Kaynak ve hedef ifadelerin türleri eşleşmelidir (bloom filtreleri hash tabanlıdır). Türler farklıysa, sistem hedef ifadeyi kaynak türe dönüştürmeye çalışır.

  • PlanNode.Conjuncts içindeki filtreler aşağı itilmez; bunlar hatalı sonuçlara yol açabilir. Örneğin, bir IN alt sorgusu join olarak yeniden yazıldığında, sistem otomatik olarak oluşturulan JOIN koşulunu PlanNode.Conjuncts içinde saklar; burada bir çalışma zamanı filtresi uygulamak sonuçlardan satırların düşmesine neden olabilir.

İtme kuralları:

  • Filtreler yalnızca OlapScanNode düğümüne itilebilir. Diğer tarama düğümü türleri desteklenmez.

  • Filtreler sol outer joinlerin, full outer joinlerin veya anti-joinlerin sol tablosuna itetilemez.

  • Hedef ifade, orijinal temel tabloda bulunan bir sütunu referans almalıdır.

  • Hedef ifade COALESCE, IFNULL veya CASE gibi null kontrolü yapan ifadeler içeremez.

Sütun iletim kuralları:

  • JOIN ON yan tümcesi A.k = B.k AND B.k = C.k içeriyorsa, C.k için oluşturulan filtre yalnızca B.k sütununa itilebilir; A.k sütununa daha fazla yayılmaz.

  • JOIN ON yan tümcesi A.a + B.b = C.c içeriyorsa ve A.a ifadesi B.a ifadesine eşdeğerse, A.a ifadesi B.a ile değiştirilebilir ve filtre B tablosuna itilebilir. A.a ve B.a eşdeğer değilse, hedef ifade tek bir sol tabloya bağlı olması gerektiğinden filtre B tablosuna itilemez.