SQL veritabanı motorlarının genel çalışma biçimi
- Tüm SQL veritabanı motorları benzer şekilde çalışır
- Girilen SQL ifadesi bir "hazırlanmış ifade (Prepared Statement)"ye dönüştürülür
- Hazırlanmış ifade "çalıştırılarak" sonuç üretilir
- SQLite'ta hazırlanmış ifade,
sqlite3_stmt nesnesinin bir örneği olarak temsil edilir
- Hazırlanmış ifadeyi temsil etmenin başlıca iki yolu vardır
- Bytecode yöntemi: SQLite'ta kullanılır
- Nesne ağacı yöntemi: MySQL, PostgreSQL'de kullanılır
Bytecode yönteminin avantajları
- Anlaması kolaydır
- Basit komutların bir listesinden oluşur, bu yüzden kolayca çıktılanabilir
EXPLAIN anahtar sözcüğü kullanılarak SQL ifadesinin bytecode'u görülebilir
- Hata ayıklaması kolaydır
- Ayrıştırma/analiz aşaması ile yürütme aşaması net biçimde ayrılır
- Debug derlemesinde
PRAGMA vdbe_trace=ON komutuyla bytecode yürütmesi izlenebilir
- Artımlı olarak çalıştırılabilir
- Bytecode olarak yazılmış SQL ifadesi bir satır çalıştırılıp durdurulabilir, sonra yeniden sürdürülebilir
- Nesne ağacı yöntemi tüm ağacı tek seferde çalıştırdığı için artımlı yürütme zordur
- Bellek kullanımı düşüktür
- Bytecode, AST'den daha küçüktür
- Prepared Statement'lar uzun süre bellekte önbelleğe alındığından bellek kullanımı önemlidir
- Çalışma hızı yüksektir
- Her aşamada karar verilmesi gereken daha az şey olduğundan yürütme daha hızlıdır
Nesne ağacı yönteminin avantajları
- Çalışma zamanında sorgu planı değiştirilebilir
- Nesne ağacı yürütme sırasında da kolayca değiştirilebilir
- Sorgunun ilerleme durumuna göre dinamik optimizasyon yapılabilir
- Paralelleştirmesi kolaydır
- Her işleme düğümü ayrı bir iş parçacığına atanabilir
- Yalnızca düğümler arası veri aktarımının senkronize edilmesi yeterlidir
- Büyük ölçekli analitik sorguların (OLAP) çok çekirdekte çalıştırılmasında avantaj sağlar
GN⁺ görüşü
- SQLite'ın temel hedefi nesnelerin interneti ortamlarında işlem işleme (OLTP) olduğundan, bytecode yöntemi uygun görünüyor. Çünkü basit, hafif ve aynı zamanda hızlı performans sunabiliyor.
- Buna karşılık MySQL veya PostgreSQL büyük ölçekli veri analizinde de yaygın kullanıldığından, sorgu yürütme planını dinamik olarak optimize edebilen ve paralelleştirebilen nesne ağacı yönteminin avantajları daha belirgin olabilir.
- Ancak nesne ağacı yönteminin de hata ayıklama veya performans analizi açısından zor olma gibi dezavantajları vardır. Ayrıca ağaç dolaşım maliyeti gibi nedenlerle, basit sorgularda bytecode'dan daha yavaş olma ihtimali de vardır.
- Önemli olan, kullanım alanı ve amaca uygun doğru yaklaşımı seçmektir. Genel amaçlı RDBMS'lerde iki yöntemin artı ve eksilerini dengeleyen hibrit bir yaklaşım kullanmak da düşünülebilir.
1 yorum
Hacker News yorumu
SQLite'ın SQL sorgularını yürütmek için soyut sözdizimi ağacı (AST) yerine bir bytecode sanal makinesi (VM) kullanması, veritabanları açısından ilginç bir tasarım tercihidir. Bytecode'un AST'ye göre avantajları şunlardır:
Bytecode VM'ler ve interpreter'lar genellikle genel amaçlı programlama dilleriyle ilişkilendirilse de, aşağıdaki gibi başka bağlamlarda da şaşırtıcı derecede faydalı olabilirler:
Microsoft SQL Server içeride nesne ağaçları kullanır, ancak sorgu planı çıktısı hâlâ tablo biçimindedir; bu da nesne ağaçlarını tablo olarak render etmenin zorluğunu gösterir.
Programcılar çoğu zaman hangi indeks aramasının döngü içinde gerçekleşmesi gerektiğini tam olarak bilir; bu yüzden bazı durumlarda SQL yerine doğrudan bytecode yazmak veya daha yüksek seviyeli bir emir kipli dil kullanmak avantajlı olabilir. Bunu SQL ile ifade etmek külfetli olabilir.
Eğer darboğaz bytecode yürütmesinde değilse (örneğin bellek veya disk hızıysa), JIT derleme ile bunu native code'a dönüştürmek mutlaka gerekli olmayabilir.
Python, Ruby, Lua gibi birçok programlama dili içeride bytecode veya AST kullanır. Veritabanı tasarım kararları nedeniyle, hata üretmeye açık üçüncü taraf kütüphaneler ya da ORM uygulamaları için kolayca ayrıştırılabilen ifadeler faydalı olabilir.