Bir PostgreSQL veritabanını optimize etmek nadiren tahminlere dayanır; kanıtlara dayanır. Veritabanı mühendisleri ve arka uç geliştiricileri için sezgilere güvenmek, geriye gitmenin yoludur. Performansı gerçekten ustalaşmak için, ekosisteme yerleşmiş güçlü teşhis araçlarını kullanmalısınız. Silahlarınızın en kritik iki aleti, makro düzeyde sorgu tanımlama için
pg_stat_statements ve mikro düzeyde yürütme yolu analizi için
EXPLAIN ANALYZE'dir.
Bu kılavuz, gecikmeyi izole etmek, kaynak tüketimini azaltmak ve yük altında duyarlı bir uygulama sürdürmek için bu araçların nasıl konuşlandırılacağını inceler.
Macro Görünüm: pg_stat_statements ile Suçluları Belirleme
Optimize etmeden önce, neyi optimize etmeniz gerektiğini bilmeniz gerekir. Yüksek trafikli ortamlarda, saniyede yüzlerce sorgu çalışır. En fazla kaynağı tüketen birkaç sorguyu nokta atışı yapmak, zaman içinde agregasyon gerektirir. İşte burada
pg_stat_statements uzantısı parlar. Bir sunucu tarafından yürütülen tüm SQL ifadeleri için yürütme istatistiklerini izler.
İlk olarak, uzantının
postgresql.conf dosyanızda etkinleştirildiğinden emin olun:
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all
Etkin hale geldikten sonra, toplam yürütme süresine göre en pahalı beş sorguyu bulmak için görünümü sorgulayabilirsiniz. Bu metrik, ortalama süreden genellikle daha önemlidir, çünkü ara sıra oluşan artışlar kullanıcı deneyimini önemli ölçüde bozabilir.
SELECT
query,
calls,
round(total_exec_time::numeric, 2) AS total_time,
round(mean_exec_time::numeric, 2) AS mean_time
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 5;
Yüksek
total_time ancak düşük
calls olan sorgulara veya şaşırtıcı derecede yüksek
mean_time olan sorgulara dikkat edin. Bu dış değerler, derinlemesine inceleme için birincil hedeflerinizdir. Kullanıcıya yönelik trafiğe baktığınızdan emin olmak için
userid veya uygulama etiketlerini kontrol ederek dahili sistem sorgularını filtrelediğinizi unutmayın.
Micro Görünüm: EXPLAIN ANALYZE ile Yürütmenin Analizi
pg_stat_statements sorunlu bir sorguyu belirledikten sonra,
EXPLAIN ANALYZE, veritabanı motorunun sorguyu tam olarak nasıl yürüttüğünü görmenizi sağlar.
EXPLAIN planlanan maliyeti gösterirken,
ANALYZE sorguyu çalıştırır ve gerçek işlenen satır sayıları ve döngü sayıları dahil olmak üzere gerçek dünya zamanlama verilerini sağlar.
Basit bir birleştirmenin beklenenden çok daha yavaş satır döndürdüğü bir senaryoyu düşünün.
EXPLAIN ANALYZE çıktısı yürütme ağacını ortaya çıkaracaktır. Belirli anti-patternlere bakıyorsunuz:
1. **Büyük Tablolarda Sıralı Taramalar**: Filtreleme koşulu olmadan milyonlarca satır içeren bir tabloda
Seq Scan görürseniz, bir dizin eksik olabilir.
2. **Büyük İç Girdilerle İç İçe Döngü Birleştirmeleri**: Bu genellikle eksik bir birleştirme dizini veya kötü kardinalite tahminlerini gösterir.
3. **Yüksek Bellek Kullanımı ile Hash Aggregates**:
work_mem çok düşükse, PostgreSQL verileri diske yazar ve bu da ciddi yavaşlamalara neden olur.
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT u.name, o.total_amount
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.created_at > '2023-01-01';
Çıktıda
Buffers seçeneğine yakından dikkat edin. Paylaşılan tampon vuruşlarını (hızlı) ve disk okumalarını (yavaş) ayırt eder. Yüksek
blk_read sayısı, G/Ç ile sınırlı performans sorunlarını gösterir.
Pratik Optimizasyon İş Akışı
Etkili sorun giderme, yinelenen bir yaklaşım gerektirir. Sunucunuzun yükünün %20'sinden sorumlu olan sorguyu bulmak için
pg_stat_statements ile başlayın. Ardından, bu belirli ifade üzerinde
EXPLAIN ANALYZE çalıştırın. Plan sıralı bir tarama gösteriyorsa, bir dizin eklenebileceğini doğrulayın. Plan, milyonlarca satırı birleştiren iç içe döngüler gösteriyorsa, kapsayan bir dizin eklemeyi veya sorguyu daha verimli bir birleştirme stratejisi kullanacak şekilde yeniden yazmayı düşünün.
Dizinlerin sihirli değnek olmadığını unutmayın. Yazma yükü eklerler ve depolama alanı tüketirler.
EXPLAIN ANALYZE'yi yeniden çalıştırarak sorgu planlayıcısının yeni dizininizi gerçekten kullanıp kullanmadığını her zaman doğrulayın. Planlayıcı dizini reddederse, bunun nedeni dizin taramasının maliyetinin sıralı taramadan daha yüksek olduğuna karar vermiş olması olabilir; bu, düşük seçicilik veya güncel olmayan istatistikler nedeniyle olabilir.
VACUUM ANALYZE çalıştırmak, planlayıcının doğru veri dağılımı bilgisine sahip olduğundan emin olur.
Sonuç
PostgreSQL'de performans mühendisliği, ölçüm ve ayarlamanın sürekli bir döngüsüdür.
pg_stat_statements'in geniş istatistiksel içgörüsünü
EXPLAIN ANALYZE'nin granüler yürütme ayrıntılarıyla birleştirerek, tepkisel hata ayıklamadan proaktif optimizasyona geçersiniz. Bu araçları ustalaşmak, yüksek kullanılabilirliği ve düşük gecikme süresini korumanıza ve veritabanınızın uygulamanız için sağlam bir temel sağlamasını sağlamanıza güç verir. Loglamaya başlayın, analiz etmeye başlayın ve kararlarınızı veriye dayandırın.