Yavaş Postgres Sorguları: Planlama mı, Yürütme mi Sorunlu?
Yavaş Postgres sorgularında EXPLAIN ANALYZE buffer istatistiklerini okuyarak sorunun planlama mı yürütme mi olduğunu nasıl anlarsınız?
Postgres'te bir sorgu yavaşladığında EXPLAIN ANALYZE çıktısının altında iki ayrı süre görürsünüz: Planning Time ve Execution Time. Bu ikisini karıştırmak pahalıya patlar; planlama darboğazına indeks eklemek yalnızca ek yük getirir, yürütme darboğazını planlama sorunu sanmak ise gerçek maliyeti hiç dokunulmadan bırakır.
500 günlük parçaya bölünmüş, 2,1 milyar satırlık gerçek bir tabloda alınan çıktıda planlama süresi yürütmeden dokuz kat uzun sürmüş (62,9 ms'e karşı 7,2 ms) ve 21 kat daha fazla buffer bloğuna dokunmuştu; çünkü Postgres, budama işlemi çoğunu eleyene kadar her partition'ı kilitleyip fiyatlandırmak zorunda. Buradaki çözüm indeks değil, plan önbellekleme ve partition sayısını azaltmaktır.
Tek bir partition üzerinde çalışan ikinci bir çıktı ise tam tersini gösterdi: planlama bir milisaniyenin altında, yürütme ise 1,6 saniyenin üzerinde; yetersiz work_mem yüzünden diske taşan hash aggregate ve yarısını elemek için 4,2 milyon satır okuyan bir filtre vardı — üstelik planlayıcının satır tahminleri son derece doğruydu. Üçüncü örnek, birbirine bağımlı sütunların (region/rack) kardinalite tahminlerini nasıl yanılttığını ve CREATE STATISTICS (dependencies) ile nasıl düzeltildiğini gösteriyor.
EXPLAIN (ANALYZE, BUFFERS) çıktısındaki buffer sayılarını her aşama için ayrı ayrı okumak, yanlış aşamayı haftalarca optimize etmeden önce hangi çözümün — bellek, depolama düzeni ya da partition budama — gerekli olduğunu anlamanın en hızlı yoludur.
Bu sentez, kaynağından yapay zeka tarafından üretildi; insan editör ya da elle onay adımı yoktur. Nasıl çalışıyoruz