← Blog
12 Ağustos 2026· otomatik üretildi

SQL ile Raporları Hızlandırmak: İndeksler ve Sorgu İpuçları

Yavaş çalışan SQL raporları iş akışını sekteye uğratır. İndeksler ve sorgu optimizasyonu ile performansı dramatik biçimde artırmanın yollarını keşfedin.

#SQL#performans#indeks#veritabanı

Sabah ilk iş olarak açtığınız rapor hâlâ "yükleniyor" dönüyorsa, bunun sorumlusu çoğunlukla donanım değil, SQL sorgusunun kendisidir. Üretim verilerinin büyüdüğü, tablo satır sayısının milyonları aştığı ortamlarda yanlış yazılmış bir sorgu sistemi dakikalarca meşgul edebilir. Bu yazıda, raporlarınızı gerçekten hızlandıracak pratik teknikleri paylaşıyorum.

Neden Yavaşlıyor?

Bir sorgunun yavaş çalışmasının arkasında genellikle şu üç neden yatar:

  • Full table scan: Veritabanı motoru, aradığı kaydı bulmak için tablonun tamamını tarar.
  • Gereksiz kolonlar: SELECT * kullanımı ağ ve bellek israfına yol açar.
  • Kötü JOIN sırası: Büyük tablolar küçük tablolardan önce birleştirildiğinde maliyet katlanır.

İndeks Nedir ve Nereye Koyulur?

İndeks, veritabanının bir telefon rehberi gibi çalışmasını sağlar; her kaydı tek tek aramak yerine doğrudan sayfaya atlar. Ama her kolona indeks koymak da çözüm değil; yazma (INSERT/UPDATE/DELETE) performansını düşürür.

İndeks koymanız gereken yerler:

  • WHERE koşullarında sık kullanılan kolonlar
  • JOIN anahtarları (foreign key'ler)
  • ORDER BY ve GROUP BY ifadelerinde geçen kolonlar

Örnek:


-- Raporlarda sık kullandığınız filtre kolonuna indeks ekleyin
CREATE INDEX idx_orders_created_at ON orders (created_at);

Bileşik (composite) indeksler de güçlü bir araçtır. Eğer her zaman created_at ve status birlikte filtreleniyorsa:


CREATE INDEX idx_orders_date_status ON orders (created_at, status);

EXPLAIN ile Sorguyu Okumayı Öğrenin

En değerli alışkanlıklardan biri sorguyu çalıştırmadan önce EXPLAIN (ya da SQL Server'da EXPLAIN PLAN / SET STATISTICS IO ON) ile analiz etmektir.


EXPLAIN SELECT order_id, total FROM orders WHERE created_at >= '2024-01-01';

Çıktıda Seq Scan görüyorsanız indeks devreye girmemiş demektir; Index Scan ya da Index Only Scan hedeflediğiniz durumdur.

Sorgu Yazarken Dikkat Edilecek İpuçları

1. SELECT * Kullanmayın

Sadece ihtiyacınız olan kolonları çekin. Hem ağ trafiğini azaltır hem de indeks kullanım olasılığını artırır.

2. WHERE İçinde Fonksiyon Kullanmayın


-- Kötü: indeks devre dışı kalır
WHERE YEAR(created_at) = 2024

-- İyi: indeks çalışır
WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01'

3. IN Listelerini Makul Tutun

Binlerce elemanlı IN (...) listeleri sorguyu yavaşlatır. Bu durumda geçici tablo ya da alt sorgu tercih edin.

4. Büyük Raporları Parçalara Bölün

Tek seferde 3 yıllık veriyi çekmek yerine ay ay ya da çeyrek çeyrek raporlayıp sonuçları birleştirin. Hem veritabanını rahatlatır hem de son kullanıcıya kısmi sonuçları daha çabuk gösterirsiniz.

5. Materialized View Kullanın

Raporunuz her gece aynı özet veriyi hesaplıyorsa bunu bir MATERIALIZED VIEW içinde saklayın. Her sorgu çalıştığında hesaplamayı tekrar yapmazsınız.

Gerçek Hayat Notu

Geçen ay bir üretim raporlama sisteminde 45 saniye süren bir sorguyu, sadece bileşik indeks ekleyip WHERE koşulundaki tarih fonksiyonunu kaldırarak 1,2 saniyeye indirdik. Herhangi bir donanım yatırımı yapmadan, sıfır maliyetle. SQL optimizasyonu tam olarak bu: önce ölçmek, sonra doğru yere dokunmak.

Sonuç

Hızlı raporlar, iyi bir veritabanı tasarımının ve dikkatli sorgu yazımının doğal sonucudur. İndeksleri stratejik kullanın, EXPLAIN çıktısını okuma alışkanlığı edinin ve fonksiyon tuzaklarından kaçının. Küçük değişiklikler, büyük farklar yaratır.