- SQLite, diskte B-ağacı yapısında saklanan satır tabanlı bir depodur ve sorguları çalıştırmak için VDBE adlı bir sanal makine kullanır. Platformdan bağımsızdır ve tek iş parçacığıyla neredeyse her ortamda çalışabilir.
- Genel amaçlı bir veritabanı olmasına rağmen OLTP iş yüklerinde çok güçlüdür. 2015'te Buffalo Üniversitesi araştırmacıları, sorguların çoğunun basit anahtar-değer aramaları ve karmaşık OLAP sorguları olduğunu ortaya koydu.
- Wisconsin-Madison Üniversitesi araştırmacıları, analitik sorguları daha hızlı hale getirmek için çalıştı. Performansı DuckDB ve Star Schema Benchmark (SSB) ile karşılaştırdılar.
Neden
- SQLite'ın neden yavaş olduğunu anlamak için
VDBE_PROFILE seçeneği kullanılarak VDBE'deki her komutun tükettiği CPU çevrimleri ölçüldü.
SeekRowID ve Column adlı iki opcode'un başlıca neden olduğu ortaya çıktı.
Veritabanı birleştirmeleri
- Veritabanlarının join işlemlerini uygulama yöntemleri arasında iç içe döngü birleştirmesi, hash join ve sort-merge join bulunur.
- SQLite en basit yöntem olan "iç içe döngü birleştirmesi"ni kullanır. Bu, B-ağacı aramasına benzediği için maliyetlidir.
Join optimizasyonunun önemi
- Join işlemlerinde tabloların sırası önemlidir. Sıra değiştirildiğinde işlem sayısı büyük ölçüde azaltılabilir. Bu, NP-zor bir problemdir.
- İç içe döngü birleştirmesinden daha iyi iki join algoritması vardır, ancak hash join çok bellek tüketir ve SQLite çoğunlukla bellek kısıtlı ortamlarda çalışır.
- Araştırmacılar, alan verimliliğini artırmak ve CPU cache line'ına sığmasını sağlamak için Bloom filtresi kullandı.
Filter ve FilterAdd adlı iki opcode eklendi.
Sonuç
- Optimizasyondan sonra CPU çevrimi analizindeki büyük mavi çubuklar neredeyse tamamen kayboldu.
- SQLite 7 ila 10 kat hızlandı. Bu araştırma sonucu SQLite v3.38.0'a uygulandı.
- Bloom filtresi, çok düşük bellek ek yüküyle SQLite'ın basit yapısına iyi uyuyor ve mevcut sorgu motoru içinde çalışıyor
3 yorum
Sürüme şimdi baktım, benim sistemim 3.42.0 kullanıyormuş. Şu an itibarıyla en güncel sürüm 3.47.2.
Sanırım şu anda kullandığım SQLite sürümünü kontrol etmem gerekecek.
Aslında bundan da öte,
openpyxlkullanarak Excel dosyaları oluşturuyorum ama çok zaman alıyor; bu yüzden başka bir kütüphane olup olmadığına bakmam gerekecek.Önce profil çıkarma yapmanız daha iyi olmaz mı?