WY · BÖLÜM 07 · FÖY 136
YAZ-136 · Yazılım & Teknik · ~2 dk

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.

Kanca

Bir sorgu canli ortamda yavasladi. Sayfa donmuyor, kullanici bekliyor; sen EXPLAIN ciktisina bakip nereden baslayacagini kestiremiyorsun, DBA da musait degil.

Hamle — Claude / ChatGPT (ikisi de calisir)
Prompt — kopyala & yapıştır
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.
Çıktı

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.

Kariyer çentiği

DBA'ya "su sorgu yavas" demek yerine "su indeksi denedim, plan soyle degisti" diyen kisi olursun; performans isine sahip cikmak seni ekipte gorunur kilar.

Sınır

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.

Örnek — bu prompt ne üretir?
Örnek girdi
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
Çıktı

Olasi darbogazlar (onem sirasina gore)

  1. DATE(s.olusturulma_tarihi) — fonksiyonla sarilmis kolon. Kolonu DATE() ile sardigin icin olusturulma_tarihi uzerine kurulacak normal bir indeks devre disi kalir; motor 4M satirin her biri icin degeri tek tek hesaplamak zorunda kalir.
  2. siparisler tablosunda filtre/JOIN kolonlarinda indeks yok. durum, olusturulma_tarihi ve musteri_id icin indeks olmadigindan JOIN ve WHERE tam tablo taramasina (~4M satir) duser.
  3. **SELECT *.** Tum kolonlari cekmek gereksiz I/O ve genis satir demek; indeks-only tarama sansini da yok eder.
  4. 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 degisirSELECT * 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)

  1. Kopya/test ortaminda once mevcut sorgu icin EXPLAIN (ANALYZE, BUFFERS) <sorgu>; calistir; toplam sureyi ve Seq Scan satirlarini not al.
  2. Indeksleri olustur, ANALYZE siparisler; ANALYZE musteriler; calistir.
  3. Yeniden yazilmis sorgu icin ayni EXPLAIN (ANALYZE, BUFFERS)'i calistir.
  4. Karsilastir: Seq Scan yerine Index Scan cikti 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.sehir secicilik dagilimi — 'A Sehri' satirlarin kucuk bir bolumuyse indeks cok ise yarar, buyuk bolumuyse az.
  • EKSIK: olusturulma_tarihi kolon tipi (timestamp mi date mi) ve zaman dilimi — tarih araligi rewrite'inin birebir ayni satirlari dondurmesi buna bagli.
  • EKSIK: siparisler tam kolon listesiSELECT * 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.

Kendi verinle çalıştır
Verini aşağıya yapıştır; prompt seninkiyle birleşip çalıştırmaya hazır tek bloğa dönüşsün. Sonra tek dokunuşla Claude ya da ChatGPT'de aç.
Hazır prompt — verini bekliyor
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.

i Bu föy örnek girdi ve çıktı içerir; yapısal doğrulama ve ölçütlü prompt koşumu henüz kaydedilmedi.

Bülten kaydı kapalı.

Bu sayfa e-posta adresi toplamaz ve liste kaydı başlatmaz. 160 hamlenin tamamı giriş yapmadan açık.