0Pricing
Coding Interview Prep · Ders

Yavaş Sorguları Fark Etme ve Düzeltme

“Bu sorgu yavaş, düzeltin” mülakat sorusu için tanılayıcı kontrol listesi.

Yavaş Sorguları Fark Etme ve Düzeltme, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“Bu Sorgu Yavaş, Düzeltin” Sorusu

Bu, mülakatın kapsamlı sorusudur: mülakat yapan kişi size yavaş bir sorgu ve bir EXPLAIN ANALYZE planı verir ve bunu tanılamanızı ister. Ölçülen şey ezberlenmiş püf noktaları değil, bir yöntemdir.

Güçlü bir yanıt, kontrol listesini sesli biçimde izler: ölçün, planı okuyun, baskın maliyeti bulun, bir varsayım oluşturun, bir çözüm önerin ve doğrulayın. Bu ders, bu kontrol listesini adım adım oluşturur.

Sistematik kalın ve akıl yürütmenizi açıklayın; kıdemli düzey değerlendirmesini kazandıran şey budur.

1. Adım: EXPLAIN ANALYZE ile Ölçün

Yalnızca SQL'e bakarak asla tahminde bulunmayın. Gerçek planı EXPLAIN (ANALYZE, BUFFERS) ile alın.

ANALYZE gerçek süreleri ve satır sayılarını verir; BUFFERS önbelleğe mi eriştiğinizi, yoksa diskten mi okuduğunuzu gösterir. Birlikte, sorgunun işlemciye mi, G/Ç'ye mi bağlı olduğunu veya yalnızca gereğinden fazla iş yapıp yapmadığını gösterirler.

Birkaç kez çalıştırın; ilk çalıştırma, süre ölçümünü bozan soğuk önbellek maliyetine maruz kalabilir.

EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.created_at >= '2026-01-01';

2. Adım: Baskın Düğümü Bulun

Rastgele arama yaparak planı baştan sona okumayın. Gerçekte en çok zamanın harcandığı düğümü bulun.

Her düğümün kendi süresini hesaplayın: toplam actual time değerinden alt düğümlerin sürelerini çıkarın ve sonucu loops ile çarpın. Payı en büyük olan düğüm hedefinizdir; geri kalan her şey gürültüdür.

Mülakatta şöyle söyleyin: Çalışma süresinin yüzde 80'i bu tek Seq Scan içinde geçiyor; bu nedenle odağımı buraya veriyorum. Başka bir şeyi iyileştirmek boşa çaba harcamak olur.

3. Adım: Tahmini ve Gerçek Değeri Karşılaştırın

Baskın düğümde tahmini satır sayısını gerçek satır sayısıyla karşılaştırın. Aradaki büyük fark, planlayıcının ne yaptığını göremediği ve muhtemelen kötü bir plan seçtiği anlamına gelir (yanlış birleştirme algoritması, yanlış erişim yöntemi).

Örnekte tahminin gerçeğin 1000 katı altında kaldığı görülür. Herhangi bir şeyi yeniden tasarlamadan önce istatistikleri yenileyin; bu tek komut planı çoğu zaman ücretsiz olarak düzeltir.

ANALYZE sütun istatistiklerini yeniden hesaplar; VACUUM ANALYZE ayrıca ölü demetleri temizler ve görünürlük haritasını günceller.

-- estimate rows=100, actual rows=120000  -> stale stats
ANALYZE orders;
-- or, for bloated tables:
VACUUM ANALYZE orders;

Yaygın Neden: Dizinlenmiş Sütunda İşlev Kullanılması

En sık görülen ve düzeltilebilen hata şudur: WHERE içinde sütunun etrafına bir işlev veya tür dönüşümü sarılır; bu nedenle dizin kullanılamaz ve altyapı sıralı tarama yapar.

Örnekte, DATE() her satıra uygulandığı için tam tarama zorunlu hâle gelir. Bunu, yalın sütun aralığı yüklemi (sargable biçim) olarak yeniden yazın; böylece created_at üzerindeki dizin devreye girer.

WHERE lower(email)=... için de aynı fikir geçerlidir: normalleştirilmiş verileri saklayın, yalın sütunu sorgulayın veya bir ifade dizini oluşturun.

-- Not sargable: index unusable
WHERE DATE(created_at) = '2026-01-01'

-- Sargable: range over the bare column
WHERE created_at >= '2026-01-01'
  AND created_at <  '2026-01-02'

Yaygın Neden: Eksik Dizin

Baskın düğüm, son derece seçici bir süzgece sahip bir Seq Scan ise veya dizinlenmemiş bir iç anahtar üzerinde loops değeri çok yüksek bir İç İçe Döngü ise çözüm genellikle bir dizindir.

Süzgeç uygulanan ya da birleştirilen sütuna bir dizin ekleyin. Örnekte, birleştirmenin sıralı taramalardan dizin taramalarına geçebilmesi için customer_id üzerinde dizin oluşturulur; planlayıcı da çok daha ucuz bir plan seçebilir.

EXPLAIN ANALYZE komutunu yeniden çalıştırarak doğrulayın; dizinin işe yaradığını varsaymayın.

CREATE INDEX idx_orders_customer
  ON orders (customer_id);

Yaygın Neden: SELECT * ve Geniş Satırlar

SELECT * her sütunu diskten ve ağ üzerinden taşır; ayrıca dizin tüm sütunları nadiren kapsadığı için yalnızca dizin kullanan taramaları engeller.

Yalnızca ihtiyacınız olan sütunları seçin. Bu, satır genişliğini küçültür, G/Ç'yi azaltır ve kapsayıcı, yalnızca dizin kullanan bir taramayı mümkün kılabilir.

SELECT * kullanan bir mülakat sorusu, bunu fark etmenizi bekler. Sütun listesini kısaltmak, geniş tablolarda genellikle hızlı ve gerçek bir kazanım sağlar.

-- Before
SELECT * FROM orders WHERE customer_id = 42;

-- After: only needed columns (may enable index-only scan)
SELECT order_id, amount FROM orders WHERE customer_id = 42;

Yaygın Neden: Diske Taşma

Bir Sort veya Hash düğümü disk kullanımı bildiriyorsa (Sort Method: external merge Disk: 25000kB veya Batches: > 1), işlem work_mem sınırını aşmış ve diske taşmıştır.

Seçenekler şunlardır: oturum için work_mem değerini artırmak, sıralamaya veya karma işlemine ulaşan satır sayısını azaltmak (daha erken süzmek) ya da sıralı düzeni sağlayan ve böylece sıralama gereksinimini tamamen ortadan kaldıran bir dizin eklemek.

Bu, mülakat yapanların ödüllendirdiği, kıdemli düzeye uygun kesin bir tanıdır.

Sort  (actual rows=2000000 loops=1)
  Sort Key: o.amount
  Sort Method: external merge  Disk: 25000kB

Yaygın Neden: Gereğinden Fazla Satır Getirme

Rows Removed by Filter: 9500000 ifadesine dikkat edin. Sorgu on milyon satır okumuş ve neredeyse hepsini atmıştır; bu, boşa harcanan çalışmanın klasik örneğidir.

Çözümler: süzgecin erişim sırasında uygulanması (sonrasında değil) için bir dizin eklemek, yüklemi daha seçici hâle getirmek veya sorguda süzme işlemini daha erkene taşıyarak ağaçta yukarı doğru daha az satır akmasını sağlamak.

Temel ilke şudur: mümkün olan en az işi yapın; mümkün olduğunca erken ve ucuza süzün.

Seq Scan on events
  Filter: (event_type = 'purchase')
  Rows Removed by Filter: 9500000

Tanılama Kontrol Listesi

Mülakatta bunu sıralarsanız yolunuzu kaybetmezsiniz:

  • EXPLAIN (ANALYZE, BUFFERS) ile Ölçün.
  • En çok zaman tüketen düğümü Bulun.
  • Tahmini ve gerçek satır sayılarını Karşılaştırın; önce güncelliğini yitirmiş istatistikleri düzeltin.
  • Sorgulanabilirliği denetleyin; süzülen sütunlardaki işlevleri kaldırın.
  • Seçici süzgeçleri ve birleştirme anahtarlarını Dizinleyin.
  • Sütunları Azaltın; SELECT * kullanmaktan kaçının.
  • Disk taşmalarını ve gereğinden fazla satır getirilmesini İzleyin.
  • Planı yeniden çalıştırarak Doğrulayın.

Bir Araya Getirme

Tam bir örneği adım adım sözlü olarak açıklayın. Plan, 50 milyon satırlı orders tablosunda bir ardışık tarama, customer_id = 42 filtresi ve 50 milyona yakın Rows Removed by Filter gösteriyor; tahmin de gerçek değerle kabaca örtüşüyor.

Tanı: seçici filtre var, dizin yok ve baskın maliyet tarama. Düzeltme: CREATE INDEX ON orders(customer_id). Yeniden çalıştırın: plan bir dizin taramasına dönüşüyor, süre saniyelerden bir milisaniyenin altına iniyor.

Bu ölç-tanıla-düzelt-doğrula döngüsü, yavaş sorgu sorularının tümü için kullanılacak yanıt şablonudur.

CREATE INDEX idx_orders_customer ON orders (customer_id);
EXPLAIN (ANALYZE, BUFFERS)
SELECT order_id, amount FROM orders WHERE customer_id = 42;

Hızlı Kontrol

Bir sorgu WHERE YEAR(order_date) = 2026 ile filtreleme yapıyor ve planda, order_date üzerinde mevcut bir B-Ağacı dizini olmasına rağmen tam ardışık tarama görünüyor. En iyi ilk düzeltme nedir?

Özet

Artık yavaş sorgu soruları için tekrarlanabilir bir yönteminiz var:

  • Her zaman EXPLAIN (ANALYZE, BUFFERS) ile ölçüm yapın ve baskın düğüme odaklanın.
  • Tahminlerle gerçek değerler birbirinden ayrıştığında önce güncelliğini yitirmiş istatistikleri düzeltin.
  • Koşulları dizinle aranabilir hâle getirin, seçici filtreler ve birleştirme anahtarları için dizinler ekleyin ve SELECT * kullanımını azaltın.
  • Diske taşmaları ve gereğinden fazla veri çekmeyi ele alın, ardından yeni planı doğrulayın.

Kontrol listesini anlatın, somut bir değişiklik önerin ve bunu kanıtlamak için planı yeniden çalıştırın; kıdemli bir mühendisten beklenen yanıt budur.

Sıkça Sorulan Sorular

“Yavaş Sorguları Fark Etme ve Düzeltme” dersi ücretsiz mi?

Evet — “Yavaş Sorguları Fark Etme ve Düzeltme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“Yavaş Sorguları Fark Etme ve Düzeltme” dersinde ne öğreneceğim?

“Bu sorgu yavaş, düzeltin” mülakat sorusu için tanılayıcı kontrol listesi. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Yavaş Sorguları Fark Etme ve Düzeltme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. EXPLAIN Planını Okuma
  2. Sıralı Tarama, Dizin Taraması ve Yalnızca Dizin Taraması
  3. Birleştirme Algoritmaları: İç İçe Döngü, Karma, Birleştirme
  4. Yavaş Sorguları Fark Etme ve Düzeltme
← Coding Interview Prep Sayfasına Dön