Metin2Games Discord sunucusuna katılmak ve anlık destek almak için tıkla!
1

PostgreSQL Query Planner: Bir SQL Sorgusu Veritabanında Nasıl Çalıştırılır?

Kayıtlı
1 Yıl 9 Ay 26 Gün
Katılım
10 Ocak 2025
Konular
163
Mesajlar
257
Tepkime puanı
36
Online süresi
11h 19m
Puan
53
Konum
Türkiye
Web sitesi
www.zyncra.shop
PostgreSQL Query Planner: Bir SQL Sorgusu Veritabanında Nasıl Çalıştırılır?

📌 Konu İçeriği — Hızlı Bakış (📂 cPanel / Web • ⏱ ~5 dk okuma • 💻 Kod: SQL)
01. PostgreSQL Query Planner: Bir SQL Sorgusu Veritabanında Nasıl Çalıştırılır?
02. 1. PostgreSQL Query Planner Nasıl Çalışır?
03. 2. EXPLAIN ile Query Plan Analizi
04. 3. Sequential Scan Her Zaman Kötü müdür?
05. 4. İndeks Oluşturmak Neden Her Zaman Performans Kazandırmaz?
06. 5. PostgreSQL İstatistikleri ve ANALYZE Mekanizması

# PostgreSQL Query Planner: Bir SQL Sorgusu Veritabanında Nasıl Çalıştırılır?


Bir SQL sorgusunun performansı yalnızca yazılan SQL kodunun uzunluğuna veya karmaşıklığına bağlı değildir. Aynı sonucu üreten iki farklı sorgu, PostgreSQL içerisinde tamamen farklı yürütme planları kullanabilir. Bu noktada devreye PostgreSQL Query Planner girer.

Query Planner, veritabanına gönderilen bir SQL sorgusunu analiz ederek en düşük tahmini maliyetle çalıştırılabilecek yürütme planını belirlemeye çalışan bileşendir. Bu süreçte tablo istatistikleri, indeksler, tahmini satır sayıları, disk erişim maliyetleri ve CPU maliyetleri gibi birçok faktör değerlendirilir.

# 1. PostgreSQL Query Planner Nasıl Çalışır?

PostgreSQL'de bir SQL sorgusu doğrudan çalıştırılmaz. Sorgu, birbirini takip eden çeşitli aşamalardan geçer:

  • Parser: SQL sorgusunun sözdizimini kontrol eder ve parse tree oluşturur.
  • Analyzer: Tablo, kolon, fonksiyon ve veri tiplerini doğrular.
  • Rewriter: Gerekli sorgu yeniden yazma işlemlerini gerçekleştirir.
  • Planner / Optimizer: Alternatif yürütme planlarını değerlendirerek uygun planı seçer.
  • Executor: Seçilen yürütme planını gerçekleştirir ve sonuçları üretir.

Örneğin aşağıdaki sorguyu ele alalım:

SQL:
SELECT *
FROM users
WHERE email = 'test@example.com';

325781_4f49359f00397ebe5fa2f03d2c514f0b.png

PostgreSQL bu sorguyu çalıştırırken users tablosunun tamamını taramak zorunda değildir. Eğer email kolonu üzerinde uygun bir indeks bulunuyorsa indeks üzerinden erişim sağlayabilir.

Ancak indeksin varlığı her zaman indeks kullanılacağı anlamına gelmez. Planner, tablodaki satır sayısını ve sorgunun tahmini maliyetini değerlendirerek Sequential Scan kullanmayı da tercih edebilir.

# 2. EXPLAIN ile Query Plan Analizi

PostgreSQL'de sorguların nasıl çalıştırılacağını incelemek için kullanılan en önemli araçlardan biri EXPLAIN komutudur.

SQL:
EXPLAIN
SELECT *
FROM users
WHERE email = 'test@example.com';

Bu komut sorguyu gerçekten çalıştırmadan PostgreSQL tarafından oluşturulan tahmini yürütme planını gösterir.

Gerçek çalışma süresini ve gerçekleşen satır sayılarını incelemek için ise EXPLAIN ANALYZE kullanılabilir:

SQL:
EXPLAIN (ANALYZE, BUFFERS)
SELECT *
FROM users
WHERE email = 'test@example.com';

325784_ca5c4ce490a9486894cbb2b8ee159569.png

Burada dikkat edilmesi gereken bazı önemli alanlar vardır:

  • Seq Scan: Tabloyu baştan sona tarar.
  • Index Scan: İndeks üzerinden ilgili kayıtlara ulaşır.
  • Index Only Scan: Uygun koşullarda tabloya gitmeden yalnızca indeks üzerinden sonuç üretir.
  • Bitmap Heap Scan: Birden fazla indeks kaydını bitmap yapısında birleştirerek tablo erişimini optimize eder.
  • Nested Loop: Bir tablodaki satırlar üzerinden diğer tabloya tekrar tekrar erişir.
  • Hash Join: Join işlemi için hash tablosu oluşturur.
  • Merge Join: Sıralanmış veriler üzerinden birleştirme gerçekleştirir.

Bu operatörlerin hangisinin seçileceği sorgunun yapısına, veri dağılımına ve maliyet tahminlerine bağlıdır.

# 3. Sequential Scan Her Zaman Kötü müdür?

Veritabanı optimizasyonunda sık yapılan hatalardan biri Sequential Scan görüldüğünde sorgunun mutlaka yavaş çalıştığını düşünmektir.

Aslında bu yaklaşım doğru değildir.

Örneğin 500 satırlık küçük bir tabloda PostgreSQL'in tüm tabloyu taraması, indeks üzerinden erişim sağlamasından daha düşük maliyetli olabilir.

Bunun yanında bir sorgu tablonun büyük bölümünü döndürecekse Sequential Scan kullanılması da oldukça mantıklı olabilir.

Önemli olan kullanılan operatörün adı değil, seçilen yürütme planının gerçek çalışma koşullarında ne kadar verimli olduğudur.

# 4. İndeks Oluşturmak Neden Her Zaman Performans Kazandırmaz?

Örneğin email kolonu üzerinde indeks oluşturduğumuzu düşünelim:

SQL:
CREATE INDEX idx_users_email
ON users(email);

Bu indeks, email üzerinden yapılan aramalarda performansı artırabilir.

Ancak indekslerin de maliyetleri vardır:

  • INSERT işlemlerinde indeksin güncellenmesi gerekir.
  • UPDATE işlemleri ek maliyet oluşturabilir.
  • DELETE işlemleri indeks kayıtlarını da etkiler.
  • İndeksler disk alanı tüketir.
  • Gereksiz indeksler bakım ve yazma performansını olumsuz etkileyebilir.

Bu nedenle indeks tasarımı yapılırken yalnızca SELECT sorgularına değil, tablonun genel okuma ve yazma iş yüküne de bakılmalıdır.

325785_38f09e6ae71e656fe784dc6ce4aacc44.png

#
5. PostgreSQL İstatistikleri ve ANALYZE Mekanizması


Query Planner'ın doğru karar verebilmesi için tablolardaki veri dağılımını mümkün olduğunca doğru tahmin etmesi gerekir.

PostgreSQL bu amaçla istatistikler kullanır.

SQL:
ANALYZE users;

Bu komut, users tablosunun istatistiklerini günceller.

İstatistiklerin eski veya yetersiz olması durumunda PostgreSQL sorgunun döndüreceği satır sayısını yanlış tahmin edebilir. Bu da yanlış yürütme planlarının seçilmesine neden olabilir.

Özellikle büyük veri setlerinde tahmin edilen satır sayısı ile gerçekleşen satır sayısı arasındaki farkı incelemek önemlidir.

# 6. Gerçek Performans Analizinde Nelere Bakılmalı?

Bir SQL sorgusunu optimize ederken yalnızca Execution Time değerine odaklanmak yeterli değildir.

Aşağıdaki alanlar birlikte değerlendirilmelidir:

  • Planning Time: Yürütme planının hazırlanması için geçen süre.
  • Execution Time: Sorgunun gerçekleştirilmesi için geçen süre.
  • Actual Rows: Gerçekte döndürülen satır sayısı.
  • Plan Rows: Planner tarafından tahmin edilen satır sayısı.
  • Buffers: Bellek ve disk blok erişimlerinin dağılımı.
  • Shared Hit Blocks: PostgreSQL shared buffer üzerinden karşılanan bloklar.
  • Shared Read Blocks: Diskten okunarak shared buffer'a alınan bloklar.

Örneğin tahmin edilen satır sayısı 100 iken gerçek sonuç 100.000 satırsa Planner'ın veri dağılımını doğru değerlendiremediği düşünülebilir.

Bu tür farklılıklar sorgu performansını doğrudan etkileyebilir.

# Sonuca Gelecek Olursak;

PostgreSQL Query Planner, veritabanı performansının merkezinde yer alan önemli bir mekanizmadır. SQL sorgularını optimize etmek isteyen geliştiricilerin yalnızca sorgu yazmayı değil, sorguların veritabanı içerisinde nasıl yürütüldüğünü de anlaması gerekir.

EXPLAIN ANALYZE, BUFFERS, indeks analizi ve istatistiklerin doğru değerlendirilmesi sayesinde performans problemlerinin kaynağı çok daha net tespit edilebilir.

Gerçek veritabanı optimizasyonu, rastgele indeks eklemek veya SQL sorgularını kısaltmak değil; PostgreSQL'in neden belirli bir yürütme planını seçtiğini anlayabilmekle başlar.

Sıkça Sorulan Sorular (SSS)
Soru 1: Paylaşılan SQL örneği canlı (production) ortamda kullanılabilir mi?
Evet. Konudaki kod bloğu bellek güvenliği, hata yakalama ve performans kriterleri gözetilerek hazırlanmıştır; kendi proje mimarinize uyarlayarak doğrudan kullanabilirsiniz.

Soru 2: PostgreSQL Query Planner: Bir SQL Sorgusu Veritabanında Nasıl Çalıştırılır uygulamasında en sık yapılan hata nedir?
Girdi doğrulamasını (validation) ve zaman aşımı/kaynak sınırlarını varsayılan değerlerde bırakmaktır. Rehberdeki yapılandırma adımlarını eksiksiz uygulayarak olası darboğazları önleyebilirsiniz.
 
Community platform by XenForo® © 2010-2026 XenForo Ltd.
© 2020-2026 Metin2Games - Tüm Hakları Saklıdır.
Geri
Üst