0Pricing
SQL Interview Prep · Ders

Sıralı Tarama, Dizin Taraması ve Yalnızca Dizin Taraması

Planlayıcının her birini neden seçtiği ve bunun sorgunuz hakkında ne anlattığı.

Sıralı Tarama, Dizin Taraması ve Yalnızca Dizin Taraması, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 2. 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, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.

Bir Tabloyu Okumanın Üç Yolu

Planlayıcı bir tablodan satırlara ihtiyaç duyduğunda üç erişim yönteminden birini seçer ve görüşmeciler üçünü de adlandırmanızı bekler:

  • Sıralı Tarama, tablodaki her satırı baştan sona okumaktır.
  • Dizin Taraması, eşleşen satırları bulmak için bir dizini taramak, ardından her birini tablodan getirmektir.
  • Yalnızca Dizin Taraması, tabloya hiç dokunmadan tamamen dizinden yanıt vermektir.

Planlayıcının her birini neden seçtiğini bilmek, bu dersin temelidir ve kıdemli adaylara yöneltilen kesin sorulardan biridir.

Sıralı Tarama Ne Yapar

Bir Sıralı Tarama, tablonun sayfalarını birbiri ardına okur ve varsa filtreyi her satıra uygular. Hiçbir dizine başvurulmaz.

Bu kötü gibi görünse de çoğu zaman doğru seçimdir. Sıralı okumalar disk için hızlıdır (rastgele sıçramalar yoktur); bu nedenle bir sorgu tablonun büyük bir bölümünü döndürdüğünde her şeyi taramak, bir dizinde milyonlarca kez atlamaktan daha iyidir.

Örnek: orders tablosunu tarayın ve amount > 100 koşulunu sağlayan satırları tutun. Siparişlerin çoğu 100'ü aşıyorsa sıralı tarama doğrudur.

EXPLAIN SELECT * FROM orders WHERE amount > 100;

Seq Scan on orders  (cost=0.00..18334.00 rows=900000 width=64)
  Filter: (amount > 100)

Dizin Taraması Ne Yapar

Bir Dizin Taraması, eşleşen anahtarlara doğrudan atlamak için bir B-ağacı kullanır; ardından karşılık gelen satırları tablo yığınından okur.

Filtre seçici olduğunda ve tablonun küçük bir bölümünü döndürdüğünde çok etkilidir. Dizin üzerinden 5 satır aramak, 10 milyon satırı okumaktan iyidir.

Plan, kullanılan dizinin adını belirtir. Her eşleşme bir dizin araması ve bir yığın getirmesi (rastgele okuma) maliyetine sahiptir; bu nedenle çok fazla satır döndürdüklerinde dizin taramaları üstünlüklerini kaybeder.

EXPLAIN SELECT * FROM orders WHERE customer_id = 42;

Index Scan using idx_orders_customer on orders
  (cost=0.42..38.50 rows=12 width=64)
  Index Cond: (customer_id = 42)

Seçicilik Seçimi Belirler

Tüm bunları yönlendiren temel kavram seçiciliktir: bir koşulun tuttuğu satırların oranı.

  • Yüksek seçicilik (benzersiz bir kimlik gibi az sayıda satır eşleşir) Dizin Taramasını destekler.
  • Düşük seçicilik ( status IS NOT NULL gibi çok sayıda satır eşleşir) Sıralı Taramayı destekler.

Yaygın bir pratik kural şudur: bir sorgu tablonun yaklaşık yüzde 5 ila 10'undan fazlasını döndürdüğünde planlayıcı çoğu zaman sıralı taramayı tercih eder; çünkü dizinin rastgele yığın getirmeleri her şeyi sırayla okumaktan daha pahalı hale gelir.

Yalnızca Dizin Taraması

Yalnızca Dizin Taraması, üçünün en hızlısıdır. Sorgunun ihtiyaç duyduğu her sütun zaten dizinin içindeyse, altyapı tablo yığınına hiç dokunmaz.

Örnek sorgu yalnızca customer_id sütununu seçer ve bu sütuna göre filtreler; dizin de customer_id üzerindedir. Gerekli tüm veriler dizinde bulunduğundan Postgres, Yalnızca Dizin Taraması bildirir.

Bu, normal dizin taramasını yavaşlatan rastgele yığın okumalarını önler ve özellikle geniş tablolarda büyük bir kazanım sağlar.

EXPLAIN SELECT customer_id FROM orders WHERE customer_id = 42;

Index Only Scan using idx_orders_customer on orders
  (cost=0.42..8.44 rows=12 width=4)
  Index Cond: (customer_id = 42)

Görünürlük Haritasının İnceliği

Görüşmeciler bu inceliği çok sever. Yalnızca dizin taraması yine de her satırın işleminiz için görünür olduğunu doğrulamak zorundadır (MVCC); yalnızca dizin görünürlük bilgisini saklamaz.

Postgres görünürlük haritasını kullanır: bir sayfa tümü görünür olarak işaretlenmişse yığını atlar; değilse yığın satırını yine de getirmek zorundadır. Plan Heap Fetches: N bilgisini gösterir.

Bu nedenle yeni güncellenmiş bir tabloda, VACUUM görünürlük haritasını yenileyene kadar çok sayıda yığın getirmesi görülebilir ve yalnızca dizin taramaları yavaşlayabilir.

Index Only Scan using idx_orders_customer on orders
  (actual time=0.01..0.03 rows=12 loops=1)
  Heap Fetches: 0

Bit Eşlem Taramaları: Orta Yol

Sıkça görülen dördüncü bir yöntem daha vardır: Bit Eşlem Yığın Taraması. Planlayıcı bunu, bir koşul düz bir dizin taramasının tercih edeceğinden daha fazla, ancak tam tablo taramasından daha az satırla eşleştiğinde seçer.

Önce dizinden eşleşen satır konumlarının bit eşlemini oluşturur (Bit Eşlem Dizin Taraması), ardından yığın sayfalarını rastgele sıra yerine fiziksel sırada getirir. Sıralı getirmeler, normal bir dizin taramasının dağınık okumalarından çok daha ucuzdur.

Bitmap Heap Scan on orders  (cost=12.0..520.0 rows=8000)
  Recheck Cond: (status = 'pending')
  ->  Bitmap Index Scan on idx_orders_status
        (cost=0..12 rows=8000)
        Index Cond: (status = 'pending')

Planlayıcı Dizininizi Neden Yok Saydı

Klasik bir mülakat sorusu: Bir dizin ekledim ama plan hâlâ Sıralı Tarama yapıyor, neden? Yaygın nedenler:

  • Koşul seçici değildir; tarama gerçekten daha ucuzdur.
  • Sütunu saran bir işlev vardır: WHERE lower(email) = ..., email üzerindeki düz bir dizini kullanamaz.
  • Tür uyuşmazlığı, dizini etkisiz kılan örtülü bir tür dönüşümünü zorunlu kılar.
  • İstatistikler güncelliğini yitirmiştir; ANALYZE çalıştırın.
  • Tablo çok küçüktür; birkaç sayfayı taramak, dizin ek yükünden daha iyidir.

Uygulamalı Teşhis

orders tablosunda created_at üzerinde bir dizin olduğunu, ancak bu sorgunun hâlâ sıralı tarama yaptığını varsayalım:

Sorunun kaynağı DATE(created_at) ifadesidir. Sütunu bir işleve sarmak, ham created_at üzerindeki dizinin kullanılmasını engeller. Çözüm, sütunu olduğu gibi bırakan bir aralık koşulu kullanarak sorguyu yeniden yazmak veya DATE(created_at) üzerinde bir ifade dizini oluşturmaktır.

-- Slow: function on the indexed column
WHERE DATE(created_at) = '2026-01-01'

-- Fast: bare column, range uses the index
WHERE created_at >= '2026-01-01'
  AND created_at <  '2026-01-02'

Yöntemleri Karşılaştırma

Mülakat için şu karşılaştırmayı aklınızda tutun:

  • Sıralı Tarama, satırların büyük bölümünü döndürürken en iyisidir; sıralı G/Ç.
  • Dizin Taraması, seçici aramalar için en iyisidir; dizin üzerinde ilerleme ve rastgele yığın getirmeleri.
  • Bit Eşlem Yığın Taraması, orta düzey eşleşme sayıları içindir; dizinden bit eşlemine, ardından sıralı yığın okumalarına geçer.
  • Yalnızca Dizin Taraması, dizin ihtiyaç duyulan her sütunu kapsadığında ve sayfalar tümüyle görünür olduğunda en hızlıdır.

Planlayıcı seçimini, başlıca seçicilik ve istatistiklerin yönlendirdiği tahmini maliyete göre yapar.

Bir Testi Zorlamak (ve Üretimde Neden Yapılmamalı)

Geliştirme sırasında bir noktayı kanıtlamak için planlayıcıyı geçici olarak yönlendirebilirsiniz: SET enable_seqscan = off; dizinleri tercih etmeye zorlar; böylece planları karşılaştırabilirsiniz.

Bu bir teşhis hilesidir; asla üretim çözümü değildir. Mülakatlarda gerçek çözümlerin daha iyi istatistikler, uygun bir dizin veya koşulu yeniden yazmak olduğunu; planlayıcı özelliklerini genel olarak devre dışı bırakmak olmadığını belirtin.

SET enable_seqscan = off;
EXPLAIN ANALYZE SELECT * FROM orders WHERE amount > 100;
SET enable_seqscan = on;

Hızlı Kontrol

Bir sorgu yalnızca email sütununu seçiyor ve email üzerinde filtre uyguluyor; ayrıca email üzerinde bir B-ağacı dizini var. Plan Index Only Scan gösteriyor. Bu neden normal Dizin Taramasından daha hızlıdır?

Özet

Erişim yöntemleriyle ilgili temel çıkarımlar:

  • Sıralı Tarama düşük seçiciliğe sahip sorgularda; Dizin Taraması ise seçici sorgularda üstün gelir.
  • Yalnızca Dizin Taraması, dizin ihtiyaç duyulan tüm sütunları kapsadığında yığından okumayı önler; Heap Fetches değerine ve görünürlük haritasına dikkat edin.
  • Bit Eşlem Yığın Taraması, yığın sayfalarını fiziksel sırada getirerek ortadaki seçeneği sunar.
  • Planlayıcı seçiciliğe ve istatistiklere göre karar verir; sütunlar üzerinde işlev kullanılması, tür uyuşmazlıkları ve güncelliğini yitirmiş istatistikler, bir dizinin yok sayılmasının nedenleridir.

Sıkça Sorulan Sorular

“Sıralı Tarama, Dizin Taraması ve Yalnızca Dizin Taraması” dersi ücretsiz mi?

Evet — “Sıralı Tarama, Dizin Taraması ve Yalnızca Dizin Taraması” 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 SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.

“Sıralı Tarama, Dizin Taraması ve Yalnızca Dizin Taraması” dersinde ne öğreneceğim?

Planlayıcının her birini neden seçtiği ve bunun sorgunuz hakkında ne anlattığı. SQL 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.

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

Önceden deneyim gerekmez. CoddyKit'te SQL 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 2. dersidir.

“Sıralı Tarama, Dizin Taraması ve Yalnızca Dizin Taraması” 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 SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL 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
← SQL Interview Prep Sayfasına Dön