2 puan yazan GN⁺ 2025-04-29 | Henüz yorum yok. | WhatsApp'ta paylaş
  • 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.

Henüz yorum yok.