Sorgu işleme bileşenlerini tanımlama
Sorguyu yürütmek için dört ayrı aşama vardır. Yürütme sırasına göre bu aşamalar şunlardır:
- Ayrıştırma
- Dönüştürme (Yeniden Yazan)
- Planlama
- İdam
Ayrıştırıcı
Ayrıştırıcı, geçerli söz dizimi için sorgu dizesini denetlemekle sorumludur. Ayrıştırıcının iki ana bölümü vardır:
- gram.y bir dizi dil bilgisi kuralından ve buna karşılık gelen eylemlerden oluşur.
- scan.1, tanımlayıcıları ve SQL anahtar sözcüklerini tanıyan lexerdır. Her anahtar sözcük veya tanımlayıcı, bir belirtecin oluşturulmasını ve ayrıştırıcıya verilmesini tetikler.
Ayrıştırıcı, hangi tabloların dahil olduğunu, hangi filtrelerin uygulandığını vb. anlamak için sorguyu tanımlanabilir bölümlere ayıran bir sorgu ağacı oluşturur. Sorgu ağacının bölümleri şunlardır:
- Komut türü - SELECT, INSERT, UPDATE veya DELETE.
-
Aralık tablosu girişi (RTE) - ilişkilerin, tabloların,
iealt sorguların, birleştirme sonuçlarının vb. listesi. SELECT deyiminde, bu öğeler FROM anahtar sözcüğünden sonra görünür. - Sonuç ilişkisi - INSERT, UPDATE ve DELETE komutlarının sonuç ilişkisi, değişikliklerin etkili olduğu tablo veya görünümdür.
- Hedef liste - SELECT ve FROM anahtar sözcükleri arasında tanımlanan sorgunun sonuçları. DELETE komutları sonuç vermez, bu nedenle planlayıcı yürütücüye silinecek satırı bulmasına izin vermek için özel bir giriş ekler. INSERT komutları, sonuç ilişkisine gitmesi gereken yeni satırları tanımlar. UPDATE komutları için hedef listede eski satırların yerini alması gereken yeni satırlar açıklanır.
- Niteleme - Son sonuç satırı için işlemin yürütülip yürütülmeyeceğini belirten bir Boole değeri. Bir SQL deyiminin WHERE yan tümcesine karşılık gelir.
- Birleştirme ağacı - bu ağaç FROM öğelerinin listesi olabilir. Birleştirmeler herhangi bir sırayla veya Dış bağlantılar gibi belirli bir sırayla yapılabilir.
- Diğerleri : ORDER BY yan tümcesi gibi bu aşamada ilgili olmayan öğeler.
Yeniden Yazıcı
Ayrıştırıcının çıktısı, bir hata bulunmadığı takdirde dönüştürme veya yeniden yazma işlemine aktarılır; aksi durumda, bir hata iletisi döndürülür.
Sorgu yeniden yazıcı, sorgu metnini kurallar uygulayarak yeniden yazar. Yeniden yazan kuralları dikkate alır ve değiştirilen sorguyu sorgu planlayıcısına iletir. Bu aşamada satır düzeyi güvenlik uygulanır.
Örneğin, INSERT, UPDATE ve DELETE sorguları dahil olmak üzere SELECT'te kurallar her zaman son adım olarak uygulanır. Kurallar ayrıca UPDATE sorgularının var olan satırların üzerine yazılmasının yerine yeni satır eklendiği ve eski satırın gizlendiğini gösterir. İşlem tamamlandıktan sonra vakum işlemi gizli satırı kaldırabilir.
Planlayıcı
Planlayıcının görevi, sorgu kurallarını almak ve sorgunun yürütülebileceği farklı yollardan hangisinin en hızlı olduğunu anlamaktır.
Planlayıcı, veriler üzerindeki fiziksel işlemleri temsil eden düğümlerle bir plan ağacı oluşturur.
PostgreSQL, bir sorgu için en uygun planı bulmak için maliyet tabanlı bir sorgu iyileştirici kullanır. Planlayıcı çeşitli yürütme planlarını değerlendirir ve CPU döngüleri, G/Ç işlemleri gibi gerekli kaynakların ne kadarının gerekli olduğunu tahmin eder. Bu tahmin daha sonra plan maliyeti olarak bilinen birimlere dönüştürülür. En düşük maliyete sahip plan seçilir.
Ancak birleştirme sayısı arttıkça olası plan sayısı katlanarak artar. Her olası planı değerlendirmek, nispeten basit sorgular için bile imkansız hale gelir. Buluşsal yöntemler ve algoritmalar, olası plan sayısını sınırlamak için kullanılır. Sonuç olarak, seçilen plan en uygun plan olmayabilir. Ancak en uyguna yakın ve makul bir sürede seçilmiştir.
Maliyet, planlayıcının en iyi tahminidir. Maliyet tahmininin amacı, aynı sorgu için farklı yürütme planlarını aynı koşullarda karşılaştırmaktır. Planlayıcı, sorgular için maliyet tahminleri oluşturmak üzere tablo ve satırlarda toplanan istatistikleri kullanır. Maliyet tahminlerinin doğru olması için istatistiklerin güncel olması gerekir.
Güncel istatistikler
Sorgu iyileştiricisinin planlayıcı bileşeni, doğru maliyet tahminleri oluşturmak için tablolar ve satırlar hakkındaki istatistikleri kullanır.
ÇÖZÜMLE veritabanı tabloları hakkındaki istatistikleri toplar ve sonuçları pg_statistic sistem kataloğunda depolar. Şu durumlarda ÇÖZÜMLE komutunu çalıştırmanız gerekir:
- Otomatik vakumu devre dışı bırakabilirsiniz (normalde tabloları otomatik olarak analiz eder)
- Otomatik vakumu devre dışı bırakdınız ve yakın zamanda ÇÖZÜMLE'yi çalıştırmadınız
- Önceki iki seçenekten biri ve birçok insert, update veya delete deyimi vardır.
Maliyet tahminleri up-totarihli istatistiklere dayanır ve eğer istatistikler güncel değilse, verimsiz bir plan seçilebilir. ANALYZE'ye parametre aktarılmadığında, veritabanındaki her tablo incelenir.
ANALYZE için söz dizimi şu şekildedir:
ANALYZE [ VERBOSE ] [ ***table*** [ ( ***column*** [, ...] ) ] ]
VERBOSE, bazı istatistiklerle birlikte hangi tablonun analiz edildiğini göstermek için ilerleme iletilerini görüntüler.
VAKUM ve ANALİZ'i düşük kullanım zamanında günlük çalışacak şekilde zamanlayın. ANALYZE, hedef tabloda yalnızca okuma kilidi gerektirdiğinden diğer işlemlerle paralel olarak çalıştırılabilir.
Yürütücü
Bu aşama planlayıcı tarafından oluşturulan planı alır ve gerekli satır kümesini ayıklamak için yinelemeli olarak işler. Bir plan düğümü her çağrıldığında yürütücü bir satır teslim etmelidir veya tamamlandığını söylemek için raporu geri bildirmelidir.
Yürütücü dört SQL sorgu türünü de değerlendirir:
- SEÇ
- INSERT
- Güncelleme
- SİLMEK
SELECT için yürütücü, sonuç kümesi olarak her satırı istemciye geri döndürür.
INSERT için, döndürülen her satır belirtilen tabloya eklenir. Bu görev ModifyTable adlı özel bir üst düzey plan düğümünde gerçekleştirilir.
UPDATE için, hesaplanan her satır tüm güncelleştirilmiş sütun değerlerini ve hedef satırın satır kimliğini içerir. Veriler güncelleştirilmiş bir satır oluşturan ve eski satırı silinmiş olarak işaretleyen bir ModifyTable düğümüne gönderilir.
DELETE işlemi için, planın döndürdüğü tek sütun, satır kimliği ID'sidir. ModifyTable düğümü, satırı silinmiş olarak işaretlemek için satır kimliğini kullanır.