Yavas SQL'i okut: olasi darbogaz + indeks/yeniden yazma onerisi
Sorgunun okunmus hali: onem sirasina dizilmis olasi darbogaz listesi, calistirilabilir CREATE INDEX onerileri, bastan yazilmis sorgu ve etkiyi olcmen icin bir once-sonra dogrulama adimi.
Bir sorgu canli ortamda yavasladi. Sayfa donmuyor, kullanici bekliyor; sen EXPLAIN ciktisina bakip nereden baslayacagini kestiremiyorsun, DBA da musait degil.
Rol: Kidemli bir veritabani performans analistisin. Sana yavas calisan bir SQL sorgusu ve elimdeki bilgileri verecegim. Gorevin: olasi darbogazlari bulmak, indeks ve sorguyu yeniden yazma onerileri cikarmak.
Sana verecegim bilgiler (bazilari eksik olabilir):
- Veritabani motoru ve surumu: [or. PostgreSQL 15 / MySQL 8 / SQL Server 2019]
- Sorgu:
[SORGUYU BURAYA YAPISTIR]
- Ilgili tablolarin tanimi ve mevcut indeksleri:
[TABLO VE INDEKS TANIMLARINI YAPISTIR - yoksa bos birak]
- Yurutme plani (EXPLAIN veya EXPLAIN ANALYZE ciktisi):
[VARSA YAPISTIR - yoksa bos birak]
- Yaklasik satir sayilari (tablo basina):
[VARSA YAZ - yoksa bos birak]
Kurallar:
1. Tahmin yurutme. Bir oneri icin gereken bilgi bende yoksa "EKSIK: ..." yaz ve tam olarak neye ihtiyacin oldugunu soyle (or. "EKSIK: orders tablosunun indeks listesi"). Elindeki bilgiyle emin olamadigin yeri uydurma, EKSIK olarak isaretle.
2. Sorgunun ne dondurdugunu degistirme; onerilerin ayni sonucu uretmeli. Sonucu degistiren bir oneri varsa onu ayrica "DIKKAT: sonuc degisir" diye isaretle.
3. Once olasi darbogazlari sirala (or. tam tablo taramasi, indekslenmemis JOIN/WHERE kolonu, fonksiyonla sarilmis kolon nedeniyle indeksin devre disi kalmasi, gereksiz SELECT *, kotu alt sorgu). Her madde icin "neden yavaslatiyor"u tek cumleyle acikla.
4. Indeks onerilerini calistirilabilir CREATE INDEX ifadesi olarak ver; kolon sirasini ve nedenini yaz.
5. Yeniden yazma onerisini, bastan yazilmis tam sorgu olarak ver; yanina ne degistirdigini kisaca yaz.
6. Her onerinin bir bedeli varsa (or. indeksin yazma/guncelleme maliyeti, ek disk) bunu belirt.
7. Uydurma sayi verme; "%80 hizlanir" deme. Etkiyi ancak yurutme planina dayanarak ve "muhtemelen" diyerek soyle.
8. Ciktiyi su basliklarla ver: Olasi darbogazlar / Onerilen indeksler / Onerilen yeniden yazma / Dogrulama adimi (once-sonra nasil olcerim) / Eksik bilgiler.
Basla.
Sorgunun okunmus hali: onem sirasina dizilmis olasi darbogaz listesi, calistirilabilir CREATE INDEX onerileri, bastan yazilmis sorgu ve etkiyi olcmen icin bir once-sonra dogrulama adimi. DBA'yi beklemeden ilk hipotezini kurup deneyebilecek hale gelirsin.
DBA'ya "su sorgu yavas" demek yerine "su indeksi denedim, plan soyle degisti" diyen kisi olursun; performans isine sahip cikmak seni ekipte gorunur kilar.
Bu bir hipotez uretir, kesin cozum degil; onerileri once kopya/test ortaminda EXPLAIN ile dogrula, gercek yurutme plani ve satir sayilari olmadan oneriler zayif kalir, sema ve sorgu ic bilgi tasiyabileceginden hassas tablo/kolon adlarini maskeleyerek yapistir.
motor: PostgreSQL 15 sorgu: SELECT * FROM siparisler s JOIN musteriler m ON m.id = s.musteri_id WHERE DATE(s.olusturulma_tarihi) = '2026-07-01' AND s.durum = 'BEKLIYOR' AND m.sehir = 'A Sehri' ORDER BY s.olusturulma_tarihi DESC; tablolar (yaklasik): - siparisler ~ 4 milyon satir. indeks: sadece PRIMARY KEY (id) - musteriler ~ 250 bin satir. indeks: PRIMARY KEY (id), UNIQUE (email) EXPLAIN ciktisi yok, canlida almaya cekiniyorum not: durum kolonunda cogunlukla 'TAMAM' degeri var, 'BEKLIYOR' az sayida olusturulma_tarihi timestamp galiba ama emin degilim
Olasi darbogazlar (onem sirasina gore)
DATE(s.olusturulma_tarihi)— fonksiyonla sarilmis kolon. KolonuDATE()ile sardigin icinolusturulma_tarihiuzerine kurulacak normal bir indeks devre disi kalir; motor 4M satirin her biri icin degeri tek tek hesaplamak zorunda kalir.siparislertablosunda filtre/JOIN kolonlarinda indeks yok.durum,olusturulma_tarihivemusteri_idicin indeks olmadigindan JOIN ve WHERE tam tablo taramasina (~4M satir) duser.- **
SELECT *.** Tum kolonlari cekmek gereksiz I/O ve genis satir demek; indeks-only tarama sansini da yok eder. ORDER BY ... DESC. Uygun sirali indeks yoksa sonuc kumesi ayrica bellekte/diskte siralanir.
Onerilen indeksler
```sql
-- durum secici (BEKLIYOR az), tarih aralik, musteri_id JOIN icin
CREATE INDEX ix_siparisler_durum_tarih
ON siparisler (durum, olusturulma_tarihi, musteri_id);
-- musteri tarafi sehir filtresi
CREATE INDEX ix_musteriler_sehir ON musteriler (sehir);
```
Kolon sirasi: once esitlik (durum), sonra aralik/siralama (olusturulma_tarihi), en sona JOIN kolonu.
Bedel: her indeks INSERT/UPDATE'lere yazma maliyeti ekler ve disk yer kaplar.
Onerilen yeniden yazma
```sql
SELECT s.id, s.musteri_id, s.durum, s.olusturulma_tarihi,
m.ad, m.sehir
FROM siparisler s
JOIN musteriler m ON m.id = s.musteri_id
WHERE s.durum = 'BEKLIYOR'
AND s.olusturulma_tarihi >= '2026-07-01'
AND s.olusturulma_tarihi < '2026-07-02'
AND m.sehir = 'A Sehri'
ORDER BY s.olusturulma_tarihi DESC;
```
Ne degisti: DATE(...) = ... yerine yarim-acik tarih araligi (kolon sarilmadigi icin indeks kullanilabilir); SELECT * yerine gerekli kolonlar.
DIKKAT: sonuc degisir — SELECT * tum kolonlari donduruyordu; asagida ornek kolonlar sectim, gercekte ihtiyacin olan kolon listesini yazmazsan donen kolonlar farklilasir. (Satir kumesi ise ayni kalir.)
Dogrulama adimi (once-sonra nasil olcerim)
- Kopya/test ortaminda once mevcut sorgu icin
EXPLAIN (ANALYZE, BUFFERS) <sorgu>;calistir; toplam sureyi veSeq Scansatirlarini not al. - Indeksleri olustur,
ANALYZE siparisler; ANALYZE musteriler;calistir. - Yeniden yazilmis sorgu icin ayni
EXPLAIN (ANALYZE, BUFFERS)'i calistir. - Karsilastir:
Seq ScanyerineIndex Scancikti mi, actual time dustu mu, okunan buffer azaldi mi.
Eksik bilgiler
- EKSIK: gercek EXPLAIN / EXPLAIN ANALYZE ciktisi — hangi adimin gercekten pahali oldugunu yalnizca plan gosterir; su anki darbogazlar tahmine dayaniyor.
- EKSIK:
musteriler.sehirsecicilik dagilimi — 'A Sehri' satirlarin kucuk bir bolumuyse indeks cok ise yarar, buyuk bolumuyse az. - EKSIK:
olusturulma_tarihikolon tipi (timestamp mi date mi) ve zaman dilimi — tarih araligi rewrite'inin birebir ayni satirlari dondurmesi buna bagli. - EKSIK:
siparislertam kolon listesi —SELECT *yerine hangi kolonlar lazim bilmiyorum; rewrite'a ornek kolonlar koydum.
ÜRETİM: TEM 2026 · CLAUDE Bu kayıt eşlenmiş örnek girdi ve çıktı içerir. Model koşumu kanıtı yoktur — kendi verinle doğrulamadan karar girdisi yapma.
Rol: Kidemli bir veritabani performans analistisin. Sana yavas calisan bir SQL sorgusu ve elimdeki bilgileri verecegim. Gorevin: olasi darbogazlari bulmak, indeks ve sorguyu yeniden yazma onerileri cikarmak.
Sana verecegim bilgiler (bazilari eksik olabilir):
- Veritabani motoru ve surumu: [or. PostgreSQL 15 / MySQL 8 / SQL Server 2019]
- Sorgu:
[SORGUYU BURAYA YAPISTIR]
- Ilgili tablolarin tanimi ve mevcut indeksleri:
[TABLO VE INDEKS TANIMLARINI YAPISTIR - yoksa bos birak]
- Yurutme plani (EXPLAIN veya EXPLAIN ANALYZE ciktisi):
[VARSA YAPISTIR - yoksa bos birak]
- Yaklasik satir sayilari (tablo basina):
[VARSA YAZ - yoksa bos birak]
Kurallar:
1. Tahmin yurutme. Bir oneri icin gereken bilgi bende yoksa "EKSIK: ..." yaz ve tam olarak neye ihtiyacin oldugunu soyle (or. "EKSIK: orders tablosunun indeks listesi"). Elindeki bilgiyle emin olamadigin yeri uydurma, EKSIK olarak isaretle.
2. Sorgunun ne dondurdugunu degistirme; onerilerin ayni sonucu uretmeli. Sonucu degistiren bir oneri varsa onu ayrica "DIKKAT: sonuc degisir" diye isaretle.
3. Once olasi darbogazlari sirala (or. tam tablo taramasi, indekslenmemis JOIN/WHERE kolonu, fonksiyonla sarilmis kolon nedeniyle indeksin devre disi kalmasi, gereksiz SELECT *, kotu alt sorgu). Her madde icin "neden yavaslatiyor"u tek cumleyle acikla.
4. Indeks onerilerini calistirilabilir CREATE INDEX ifadesi olarak ver; kolon sirasini ve nedenini yaz.
5. Yeniden yazma onerisini, bastan yazilmis tam sorgu olarak ver; yanina ne degistirdigini kisaca yaz.
6. Her onerinin bir bedeli varsa (or. indeksin yazma/guncelleme maliyeti, ek disk) bunu belirt.
7. Uydurma sayi verme; "%80 hizlanir" deme. Etkiyi ancak yurutme planina dayanarak ve "muhtemelen" diyerek soyle.
8. Ciktiyi su basliklarla ver: Olasi darbogazlar / Onerilen indeksler / Onerilen yeniden yazma / Dogrulama adimi (once-sonra nasil olcerim) / Eksik bilgiler.
Basla.
Yapıştırdığın veri tarayıcından çıkmaz — WhiteYaka'ya gönderilmez. Prompt panoya kopyalanır; açılan sohbete Ctrl/⌘ + V ile yapıştırırsın.
Bülten kaydı kapalı.
Bu sayfa e-posta adresi toplamaz ve liste kaydı başlatmaz. 160 hamlenin tamamı giriş yapmadan açık.