- SQL motoru, istemci ile depolama katmanı arasında çalışan veritabanının mantıksal katmanıdır
- SQL motorunun temel süreçleri olan parsing, binding, plan sadeleştirme, join keşfi ve maliyet değerlendirmesi, çalıştırma, sonuç spooling için ayrıntılı açıklamalar sunuluyor
- Parsing, SQL sorgusunu yapılandırılmış bir soyut sözdizim ağacına (AST) dönüştürür
- Binding, AST içindeki alanları mevcut veritabanı kataloğundaki sembollerle eşleştirir
- Plan sadeleştirme, SQL'in karmaşık sözdizimini daha hızlı çalıştırma için sadeleştirilmiş bir biçime normalize eder
- Plan keşfi, join, aggregate ve window function için farklı varyasyonları inceleyerek en iyi çalıştırma planını bulur
- Çalıştırma ve sonuç spooling, nihai planı çalıştırılabilir bir biçime dönüştürür ve sonuçları istemciye döndürür
SQL motoruna genel bakış
- SQL motoru, istemci istekleri ile veri depolama katmanı arasında yer alan mantıksal bir aracı katmandır
- Temel aşamalar
- Parsing: Sorguyu AST'ye (soyut sözdizim ağacı) dönüştürür
- Binding: AST içindeki tanımlayıcıları veritabanı kataloğundaki sembollerle ilişkilendirir
- Plan Simplification: Farklı SQL sözdizimlerini standartlaştırılmış plan biçimine sadeleştirir
- Join Exploration & Costing: Farklı join sıralarını araştırır ve maliyetlerini değerlendirir
- Execution: En iyi çalıştırma planını kullanarak sorguyu yürütür
- Spooling Results: Sonuçları istemciye döndürür
Parsing
- Parsing, girilen sorguyu token'lara ayırıp AST'ye dönüştürme sürecidir
- Sağ özyinelemeli parser, anlaşılması ve debug edilmesi kolay olsa da daha fazla stack belleği kullanır
- Sol özyinelemeli parser (Yacc tabanlı), bellek açısından verimlidir ancak daha karmaşık mantık gerektirir
- Dolt, hızlı parsing desteği için sol özyinelemeli parser kullanır
- Parsing başarılı olduğunda AST yapısı Yacc kurallarıyla eşleşir
Binding
- Binding, AST alanlarını veritabanındaki gerçek tablo ve kolon sembollerine bağlama sürecidir
- Temel kavramlar
- Tablo tanımı: Verinin kaynağı olarak işlev görür
- Kolon tanımı: Tablo kaynağındaki belirli bir kolona başvurur
- Takma ad (Alias): Skaler bir değeri hem kaynak hem de hedef olarak kullanır
- Skaler alt sorgu: Üst kapsamı paylaşır ve ad binding işlemini gerçekleştirir
- Binding sonucunda sql.Node biçiminde çalıştırma planı düğümleri oluşturulur
Plan sadeleştirmeleri
- Farklı SQL ifadelerini normalize edilmiş biçime dönüştürerek çalıştırma optimizasyonuna yardımcı olan süreçtir
- Öne çıkan optimizasyonlar
- Filter Pushdown: Gereksiz satırları kaldırır
- Column Pruning: Gereksiz kolonları kaldırır
- Alt sorgu dekorrelasyonu (subquery decorrelation) gibi dönüşümlerle join planı optimizasyonu da yapılır
Tip zorlaması
- Tip zorlaması, bağlama göre ifade tiplerini otomatik olarak dönüştürme sürecidir
- WHERE, INSERT gibi bağlamlara göre tipler değişebilir
- Dolt, tip dönüşümünü binding aşamasında kademeli olarak ele alıyor
Join keşfi
- Join keşfi, farklı join sıraları üretip inceleme sürecidir
- İki keşif stratejisi
- Yukarıdan aşağı backtracking: Yalnızca geçerli join sıralarını araştırır
- Aşağıdan yukarı dinamik programlama (DP): Tüm kombinasyonları deneyerek en iyi join sırasını bulur
- Ara durumları verimli biçimde yönetmek için Memo yapısı kullanılır
Fonksiyonel bağımlılıklar
- 5 veya daha fazla tablo join edildiğinde maliyet hızla artabilir
- Birincil anahtar (PK) tabanlı join'lerdeki gibi 1:1 ilişki kullanılırsa keşif maliyeti azaltılabilir
- Optimizasyon için önce LOOKUP_JOIN değerlendirilir
Ara gösterim özeti (IR Intermission)
- Şimdiye kadar ilerlenen 3 aşamalı IR özeti
- AST: Token'ların düzenlenmesi
- Kapsam binding'i: Kolon başvurularının doğrulanması
- Memo: Join keşfi ve maliyet değerlendirmesi için gösterim
Join maliyet değerlendirmesi
- Join maliyet değerlendirmesi, mümkün olan tüm planlar için çalıştırma maliyetini tahmin etme sürecidir
- Maliyet unsurları
- Girdi tablolarının boyutu
- Sonuç tablosunun boyutu
- Join operatörünün türü (LOOKUP_JOIN, HASH_JOIN vb.)
- Dolt, maliyeti doğru tablo istatistiklerine (histogram) dayanarak değerlendirir
Join ipuçları
- Kullanıcının verdiği ipuçlarına göre join stratejisini öncelikli olarak uygulamaya çalışır
- Çelişkili veya uygunsuz ipuçları göz ardı edilir
Çalıştırma
- En iyi plan, gerçekten çalıştırılabilir bir iterator (Volcano Iterator) yapısına dönüştürülür
- Özellikler
- Materyalize etmeyen (non-materializing) iterator: Satırları anında döndürür
- Materyalize eden (materializing) iterator: Tüm satırları topladıktan sonra döndürür
- Kolon başvuruları, çalıştırmadan önce indeks ofseti tabanlı olarak eşlenir
I/O ve sonuç spooling
- Çalıştırma sonuçları MySQL protokolü formatına dönüştürülerek istemciye iletilir
- Bazı durumlarda anahtar-değer (KV) depolama katmanından sonuçlar doğrudan okunarak optimizasyon yapılır
- Batch işleme ve buffer yeniden kullanımıyla işlem hızı ve bellek verimliliği artırılır
Gelecek planları
- Dolt, temel olarak yerel sunucuda satır tabanlı çalıştırma (row-based execution) kullanıyor
- AST, kapsam tabanlı binding ve Memo yapısı üzerinden join keşfi gibi 3 aşamalı ara gösterim (IR) sayesinde en iyi çalıştırma planının oluşturulmasını destekliyor
- Join Search ve Join Costing ile en uygun join stratejisini belirliyor
- Gelecekte IR birleşimi ve bellek yeniden kullanım optimizasyonu ile performans iyileştirmesi planlanıyor
Henüz yorum yok.