EXPLAIN Planını Okuma
Bir sorgu planındaki tarama türlerinin, birleştirme yöntemlerinin ve maliyet tahminlerinin yorumlanması.
EXPLAIN Planını Okuma, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 1. 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.
Mülakat Yapanlar EXPLAIN'i Neden Soruyor
Kıdemli pozisyon mülakatına geldiğinizde, mülakat yapanlar sorgu yazın demeyi bırakıp bu sorgu neden yavaş diye sormaya başlar. Bu soruyu yanıtlayan araç EXPLAIN'dir.
EXPLAIN, veritabanının yürütme planını gösterir: planlayıcının SQL'inizi çalıştırmak için seçtiği adım adım stratejiyi. Hangi tabloların tarandığını, hangi sırayla birleştirildiğini ve her adımın yaklaşık maliyetini ortaya koyar.
Bir planı okuyabilmeniz, yalnızca sözdizimini değil, altyapı motorunu da anladığınızı gösterir. Mülakat yapanların orta seviye ile kıdemli seviyeyi ayırmak için kullandığı ölçüt tam olarak budur.
EXPLAIN ve EXPLAIN ANALYZE
İki tür vardır ve mülakat yapanlar aralarındaki ayrımı duymayı sever.
- EXPLAIN, sorguyu çalıştırmadan planlayıcının tahmini planını gösterir. Hızlı ve güvenlidir.
- EXPLAIN ANALYZE, sorguyu gerçekten çalıştırır ve tahminlerin yanında gerçek satır sayılarını ve süreleri raporlar.
En değerli nokta, tahmini satır sayılarını gerçek satır sayılarıyla karşılaştırmaktır. Büyük bir uyumsuzluk, planlayıcının istatistiklerinin kötü olduğunu ve muhtemelen hatalı bir seçim yaptığını gösterir.
Dikkat: EXPLAIN ANALYZE sorguyu gerçekten çalıştırır; bu nedenle geri alınacak bir işlem içinde sarmalanmadıkça herhangi bir INSERT veya UPDATE işlemini de gerçekleştirir.
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 42;Ağacı Nasıl Okursunuz
Bir plan bir ağaçtır, liste değildir. En fazla girintilenmiş düğümler, ilk çalıştırılan yapraklardır; sonuçlar yukarı doğru akar ve son çıktıyı üreten köke ulaşır.
İçten dışa okuyun: en derin düğümü bulun; yürütme orada başlar. Her üst düğüm, alt düğümlerinin ürettiği satırları tüketir.
Mülakatta bunu şöyle anlatın: önce bu tabloyu tararız, bu satırlar şu birleştirmeye aktarılır, birleştirme sıralamaya aktarılır, sıralama da sınırlandırmaya aktarılır. Duymak istedikleri tam olarak bu aşağıdan yukarı anlatımdır.
Bir Plan Düğümünün Anatomisi
Bir Postgres planındaki her düğüm aynı temel sayıları taşır:
- maliyet=0.00..35.50 başlangıç maliyeti..toplam maliyet, keyfi planlayıcı birimleriyle
- satırlar=1000 üretilen tahmini satır sayısı
- genişlik=64 tahmini ortalama satır boyutu, bayt cinsinden
İlk maliyet başlangıç maliyetidir (ilk satır görünmeden önce yapılan çalışma; karma tablosu oluşturmak gibi). İkincisi, tüm satırları döndürmenin toplam maliyetidir. Toplam maliyetin daha yüksek olması, planlayıcının göreli gider tahmininin daha yüksek olduğunu gösterir.
Seq Scan on orders (cost=0.00..35.50 rows=1000 width=64)Uygulamalı Bir Örnek
Basit bir filtrelenmiş sorguyu ele alalım. Aşağıdaki plan, tek satırda tüm hikâyeyi anlatır.
Bu, orders üzerinde bir Sıralı Taramadır (tam tablo okuması) ve status = 'shipped' filtresini uygular. Planlayıcı, eşleşen 1000 satır olduğunu tahmin eder.
orders tablosunda 10 milyon satır varsa ve yalnızca 1000 tanesi eşleşiyorsa, bir görüşmeci sizden şunu söylemenizi bekler: Buradaki sıralı tarama israftır; durum üzerinde (veya daha seçici bir sütun üzerinde) bir dizin kullanmak, tablonun tamamını okumaktan kaçınmamızı sağlar.
EXPLAIN SELECT * FROM orders WHERE status = 'shipped';
Seq Scan on orders (cost=0.00..18334.00 rows=1000 width=64)
Filter: (status = 'shipped'::text)Tahmini ve Gerçek Satır Sayıları
EXPLAIN ANALYZE ile parantez içinde gerçekleşen sayıları da elde edersiniz.
Örneğe bakın: planlayıcı 1000 satır tahmin etmiş, ancak gerçekte 480000 satır elde etmiş. Bu, 480 kat düşük bir tahmindir. Planlayıcı, az satır olduğunu varsayarak stratejisini seçmiş; bu nedenle seçimi gerçek veriler için muhtemelen yanlıştır.
Mülakatlarda bu fark, teşhisinizin ana noktasıdır: istatistikler güncelliğini yitirmiş; tablo üzerinde ANALYZE çalıştırın, ardından planlayıcı muhtemelen daha iyi bir plan seçer.
Seq Scan on orders
(cost=0.00..18334.00 rows=1000 width=64)
(actual time=0.02..210.4 rows=480000 loops=1)N Döngüsü Ne Anlama Gelir
loops değeri, adayların beklediğinden daha önemlidir. Bir düğümün kaç kez çalıştırıldığını gösterir.
Bu değer, iç içe döngü birleştirmesinin iç tarafında görünür: iç düğüm her dış satır için bir kez çalışır. loops=480000 ise bu iç adım 480 bin kez çalıştırılmıştır.
Önemli nokta: gösterilen satır başına süre ve satır sayısı döngü başınadır. Gerçek toplamı bulmak için bunları loops ile çarpmanız gerekir. Döngü başına 0.004ms ile ucuz görünen bir düğüm, 480000 döngü boyunca neredeyse 2 saniyeye ulaşır.
Index Scan using idx_cust on orders
(actual time=0.003..0.004 rows=1 loops=480000)Maliyet Görecelidir, Milisaniye Değil
Yaygın bir tuzak: adaylar cost=18334 değerini okuyup bu 18 saniye sürer der. Yanlış.
Maliyet, bir sıralı sayfa okuması 1.0'a eşit olacak şekilde ayarlanmış keyfi planlayıcı birimleriyle ifade edilir. Yalnızca planları birbiriyle karşılaştırmak için anlamlıdır; gerçek geçen süreyi göstermez.
Gerçek süreyi ölçmek için EXPLAIN ANALYZE ve milisaniye cinsinden ölçülen actual time değerlerine ihtiyacınız vardır. Bunu mülakatta açıkça söyleyin; metriği gerçekten anladığınızı gösterir.
Bir Birleştirme Planını Okuma
İşte iki tabloluk bir plan. Aşağıdan yukarı okuyun.
İlk iki tarama, orders ve customers tablolarından satırları toplar. Bu satırlar bir Karma Birleştirmesine aktarılır: bir tarafta karma oluşturulur, diğer taraf karmada arama yapar. Birleştirmenin çıktısı da ardından nihai sonuca aktarılır.
Girintilemenin yapıyı gösterdiğine dikkat edin: her iki tarama da Karma Birleştirmesi altında yer alır. Görüşmeci, birleştirme yöntemini (burada karma) ve hangi tablonun karmaya dönüştürüldüğünü (genellikle daha küçük olanı) belirlemenizi bekler.
Hash Join (cost=30.0..520.0 rows=900 width=72)
Hash Cond: (o.customer_id = c.id)
-> Seq Scan on orders o (cost=0..400 rows=10000)
-> Hash (cost=18..18 rows=500)
-> Seq Scan on customers c (cost=0..18 rows=500)Belirtilmesi Gereken Uyarı İşaretleri
Her plandaki şu uyarı işaretlerini fark etmeye çalışın:
- Dev bir tabloda Sıralı Tarama ve seçici bir filtre varsa, bir dizin yardımcı olabilir.
- Tahmini satır sayısı gerçekle çok farklıysa, istatistikler güncelliğini yitirmiştir.
- Büyük bir tablo üzerinde yüksek döngü sayısına sahip İç İçe Döngü varsa, çoğu zaman iç birleştirme anahtarında eksik bir dizin vardır.
- Sıralamanın veya Karmanın diske taşması (
Diskkullanımı olarak gösterilir),work_memçok küçüktür. - Filtreyle Kaldırılan Satır Sayısı çok yüksekse, tablonun çoğunu okuyup atmışsınızdır.
Çıktı Biçimleri ve BUFFERS
Planlar birkaç biçimde sunulur. Varsayılan TEXT, mülakatlarda yüksek sesle okuduğunuz biçimdir. Ancak yapılandırılmış çıktı da isteyebilirsiniz.
EXPLAIN (FORMAT JSON) veya FORMAT YAML, araçların ve panoların ayrıştırdığı makine tarafından okunabilir planlar üretir. Bunlara elle nadiren ihtiyaç duyarsınız; ancak var olduklarını bilmek kıdemli düzeyde hoş bir ayrıntıdır.
Parantez içine seçenekler ekleyin: EXPLAIN (ANALYZE, BUFFERS). BUFFERS seçeneği, önbellek isabetlerini disk okumalarıyla karşılaştırmalı olarak bildirir; G/Ç'ye bağlı sorguları teşhis etmek için çok değerlidir.
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders WHERE customer_id = 42;Hızlı Kontrol
Bir görüşmeci size maliyet bölümünde rows=1000, ancak actual ... rows=480000 bulunan bir EXPLAIN ANALYZE düğümü gösteriyor. En olası teşhis nedir?
Özet
Artık bir planı kıdemli bir geliştirici gibi okuyabilirsiniz:
EXPLAINtahmin eder;EXPLAIN ANALYZEçalıştırır ve ölçer.- Ağacı aşağıdan yukarı okuyun; yapraklar önce çalışır, kök çıktı üretir.
- Her düğüm maliyeti (göreli birimler), satırları ve genişliği gösterir;
actual timegerçek milisaniye değeridir. loops, döngü başına değerleri çarpar; iç içe döngülere dikkat edin.- Tahmini ve gerçekleşen satır sayıları arasındaki fark, en önemli teşhis sinyalinizdir.
Planı yüksek sesle anlatın ve uyarı işaretlerini belirtin; mülakatta başarı getiren davranış budur.
Sıkça Sorulan Sorular
“EXPLAIN Planını Okuma” dersi ücretsiz mi?
Evet — “EXPLAIN Planını Okuma” 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.
“EXPLAIN Planını Okuma” dersinde ne öğreneceğim?
Bir sorgu planındaki tarama türlerinin, birleştirme yöntemlerinin ve maliyet tahminlerinin yorumlanması. 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 1. dersidir.
“EXPLAIN Planını Okuma” 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
- EXPLAIN Planını Okuma
- Sıralı Tarama, Dizin Taraması ve Yalnızca Dizin Taraması
- Birleştirme Algoritmaları: İç İçe Döngü, Karma, Birleştirme
- Yavaş Sorguları Fark Etme ve Düzeltme