- Katılım
- 7 Nis 2025
- Konular
- 367
- Mesajlar
- 780
- Çözümler
- 1
- Tepkime puanı
- 121
- Puan
- 93
- Konum
- İstanbul
- Web sitesi
- forumagel.com
Yazdığınız bir SQL sorgusu doğru sonucu döndürebilir, ancak büyük bir veritabanında bu sorgunun çalışması dakikalar hatta saatler sürebilir. Performans sorunları, kullanıcı deneyimini olumsuz etkiler ve uygulama genelinde darboğazlara yol açabilir. Veritabanı performansını optimize etmenin temel yollarından biri, veritabanı yönetim sisteminin (DBMS) sorgularınızı nasıl çalıştırdığını anlamaktır. Bu da Sorgu Yürütme Planları sayesinde mümkündür.
Sorgu Yürütme Planı Nedir?
Sorgu Yürütme Planı (Execution Plan), DBMS'in belirli bir SQL sorgusunu çalıştırmak için izleyeceği adım adım yolu gösteren bir plandır. Sorgu Optimizleyici (Query Optimizer) adı verilen DBMS'in bir bileşeni, yazdığınız SQL sorgusunu analiz eder ve veritabanının istatistiklerini, indeksleri ve diğer faktörleri kullanarak sorguyu en verimli şekilde çalıştırmanın farklı yollarını değerlendirir. Bu değerlendirme sonucunda en maliyetli (en hızlı) planı seçer ve bu planı size yürütme planı olarak sunar.
Yürütme planı, veriye nasıl erişileceğini (tablo tarama mı, indeks kullanımı mı?), tabloların hangi sırayla birleştirileceğini (
Yürütme Planı Nasıl Elde Edilir?
Farklı DBMS'ler yürütme planlarını elde etmek için farklı komutlar veya araçlar sunar:
Yürütme Planında Nelere Dikkat Edilmeli?
Yürütme planları, özellikle karmaşık sorgular için ilk başta biraz kafa karıştırıcı görünebilir. Ancak bazı anahtar öğeler size performans sorunlarının nerede olduğunu gösterebilir:
Bu bölümde sorgu yürütme planlarının ne olduğunu, nasıl elde edileceğini ve temel olarak nasıl yorumlanacağını ele aldık. Performans optimizasyonu geniş bir konudur ve yürütme planları bu konunun sadece bir parçasıdır.
Bir sonraki bölümde, SQL'de satırlar arası hesaplamalar yapmanızı sağlayan ve karmaşık raporlama görevlerini kolaylaştıran Pencere Fonksiyonları (Window Functions) konusuna değinebiliriz.
Sorgu Yürütme Planı Nedir?
Sorgu Yürütme Planı (Execution Plan), DBMS'in belirli bir SQL sorgusunu çalıştırmak için izleyeceği adım adım yolu gösteren bir plandır. Sorgu Optimizleyici (Query Optimizer) adı verilen DBMS'in bir bileşeni, yazdığınız SQL sorgusunu analiz eder ve veritabanının istatistiklerini, indeksleri ve diğer faktörleri kullanarak sorguyu en verimli şekilde çalıştırmanın farklı yollarını değerlendirir. Bu değerlendirme sonucunda en maliyetli (en hızlı) planı seçer ve bu planı size yürütme planı olarak sunar.
Yürütme planı, veriye nasıl erişileceğini (tablo tarama mı, indeks kullanımı mı?), tabloların hangi sırayla birleştirileceğini (
JOIN
sırası), hangi JOIN
algoritmasının kullanılacağını (Nested Loop, Hash Match, Merge Join vb.), verinin nasıl sıralanacağını ve gruplandırılacağını ve sorgunun diğer adımlarını detaylandırır.Yürütme Planı Nasıl Elde Edilir?
Farklı DBMS'ler yürütme planlarını elde etmek için farklı komutlar veya araçlar sunar:
- MySQL ve PostgreSQL: Sorgunun başına
EXPLAIN
anahtar kelimesini ekleyerek planı metin formatında görebilirsiniz. Örneğin:Kod:EXPLAIN SELECT * FROM Musteriler WHERE Sehir = 'Ankara';
- Microsoft SQL Server: SQL Server Management Studio (SSMS) gibi araçlarda sorguyu çalıştırırken "Display Actual Execution Plan" seçeneğini kullanabilir veya
SET SHOWPLAN_ALL ON;
gibi komutları kullanabilirsiniz. Bu, genellikle görsel bir plan sunar ve daha kolay okunabilir. - Oracle:
EXPLAIN PLAN FOR
komutunu kullanarak bir plan oluşturup, daha sonra bu planı sorgulayarak görebilirsiniz.
Yürütme Planında Nelere Dikkat Edilmeli?
Yürütme planları, özellikle karmaşık sorgular için ilk başta biraz kafa karıştırıcı görünebilir. Ancak bazı anahtar öğeler size performans sorunlarının nerede olduğunu gösterebilir:
- Maliyetler (Costs): Planın farklı operatörleri veya adımları için tahmini maliyet yüzdelerini gösterir. Yüksek maliyetli adımlar genellikle performansı etkileyen noktalardır.
- Erişim Yöntemleri (Access Methods):
Table Scan
/Full Scan
: DBMS'in bir tabloyu baştan sona okuduğu anlamına gelir. Büyük tablolar için genellikle çok yavaştır. İndeksleme eksikliği veya uygunWHERE
koşulunun olmaması durumunda görülür.Index Seek
: İndeksi kullanarak belirli satırlara doğrudan erişildiği anlamına gelir. Çok hızlıdır ve genellikle istenen erişim yöntemidir. Uygun indekslerin veWHERE
koşullarının kullanıldığını gösterir.Index Scan
: İndeksin tamamının veya bir kısmının sıralı olarak okunduğu anlamına gelir.Table Scan
'den daha iyi olsa da,Index Seek
kadar hızlı değildir.
JOIN
Tipleri: DBMS'in tabloları birleştirmek için hangi algoritmayı seçtiğini gösterir (Nested Loop
,Hash Match
,Merge Join
). Farklı algoritmalar, birleştirilen tabloların boyutuna ve indeks durumuna göre farklı performans özelliklerine sahiptir. Optimizleyici en uygun olanı seçmeye çalışır, ancak bazen indeks eksikliği veya istatistiklerin güncel olmaması yanlış seçime yol açabilir.Sort
Operatörleri: Sorgu sonuçlarının sıralandığı veyaGROUP BY
için verinin hazırlandığı adımlardır. Büyük veri kümeleri üzerinde sıralama maliyetli olabilir. Uygun indekslerin veya sorgu yeniden yazımının sıralama maliyetini azaltıp azaltmayacağını değerlendirebilirsiniz.- Geçici Tablolar (
Temporary Table
) / Çalışma Alanı (Worktable
): DBMS'in sorguyu çalıştırmak için geçici olarak disk veya bellekte veri depolaması gerekebilir. Bu, sorgunun karmaşık olduğunu ve ek maliyet getirdiğini gösterebilir.
- Yüksek Maliyetli Operatörleri Tespit Edin: Planda en yüksek maliyet yüzdesine sahip adımlara odaklanın.
Table Scan
Kontrolü: Büyük tablolar üzerindeTable Scan
görüyorsanız, ilgili sütunlarda indeks eksikliği olabilir veyaWHERE
/JOIN
koşullarınız indeks kullanımına uygun olmayabilir.- İndeks Kullanımını Değerlendirin: Optimizleyicinin beklediğiniz indeksleri kullanıp kullanmadığına bakın. İstatistikler güncel değilse veya indeksler parçalanmışsa (fragmented), indeksler kullanılmayabilir.
JOIN
Sırası ve Tipi: Optimizleyicinin seçtiğiJOIN
sırası veya tipi ideal olmayabilir. Nadiren de olsa,JOIN
ipuçları (hints) kullanarak optimizleyiciye yönlendirme yapabilirsiniz (ancak bu genellikle önerilmez).- Sorguyu Yeniden Yazma: Bazen aynı sonucu veren, ancak optimizleyicinin daha verimli bir plan oluşturmasına olanak tanıyan farklı SQL yazım şekilleri olabilir (örneğin, alt sorgu yerine
JOIN
kullanmak veya tam tersi).
Bu bölümde sorgu yürütme planlarının ne olduğunu, nasıl elde edileceğini ve temel olarak nasıl yorumlanacağını ele aldık. Performans optimizasyonu geniş bir konudur ve yürütme planları bu konunun sadece bir parçasıdır.
Bir sonraki bölümde, SQL'de satırlar arası hesaplamalar yapmanızı sağlayan ve karmaşık raporlama görevlerini kolaylaştıran Pencere Fonksiyonları (Window Functions) konusuna değinebiliriz.