- Katılım
 - 7 Nis 2025
 
- Mesajlar
 - 782
 
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 
EXPLAINanahtar 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 FORkomutunu 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 uygunWHEREkoş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 veWHEREkoş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 Seekkadar hızlı değildir.
 JOINTipleri: 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.SortOperatörleri: Sorgu sonuçlarının sıralandığı veyaGROUP BYiç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 ScanKontrolü: Büyük tablolar üzerindeTable Scangörüyorsanız, ilgili sütunlarda indeks eksikliği olabilir veyaWHERE/JOINkoş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.
 JOINSırası ve Tipi: Optimizleyicinin seçtiğiJOINsırası veya tipi ideal olmayabilir. Nadiren de olsa,JOINipuç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 
JOINkullanmak 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.
		        


