0Pricing
SQL Interview Prep · Ders

Sonsuz Özyinelemeden Kaçınma

Döngü algılama, derinlik sınırları ve her mülakatçının kontrol ettiği özyineleme korumasını öğrenin.

Sonsuz Özyinelemeden Kaçınma, CoddyKit'te ücretsiz bir SQL 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, 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.

Sorunun Ardındaki Soru

Özyinelemeli bir CTE yazdıktan sonra, dikkatli bir mülakatçı şunu sorar: "Verilerde bir döngü varsa ne olur?" Bu soru, özyinelemenin sonsuza kadar çalışabileceğini anlayıp anlamadığınızı ve buna karşı nasıl koruma sağlayacağınızı bilip bilmediğinizi ölçer.

Döngü, hiyerarşinin kendi üzerine kapanmasıdır: A, B'ye rapor verir; B de A'ya rapor verir. Saf özyinelemeli üye, ikisi arasında sonsuza kadar gidip gelir.

Döngü Nasıl Oluşur

Ağaçların döngüsüz olması gerekir, ancak gerçek veriler karmaşıktır. Hatalı bir güncelleme, bir çalışanı dolaylı olarak kendisinin yöneticisi yapabilir. "Kullanıcıları takip eden kullanıcılar" gibi bir çizge ise doğası gereği döngülüdür.

Özyinelemeli üye daha önce ziyaret ettiği bir düğümle yeniden karşılaştığında bu düğümü tekrar üretir; bu da alt düğümlerini yeniden tetikler ve döngü hiç boşalmaz. Özyineleme yalnızca bir adım hiç satır döndürmediğinde durur; bir döngü ise her zaman satır döndürülmesini garanti eder.

Koruma 1: Derinlik Sınırı

En basit güvenlik ağı, özyinelemeli üyede bir üst sınırı olan derinlik sayacıdır. Bir döngü bulunsa bile özyineleme bu sınıra ulaştığında durur.

Bu kaba bir yöntemdir — meşru derinlikteki ağaçları da sınırlar — ancak hızlıdır ve mülakatlarda kullanıma uygundur.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 1 AS depth
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
    WHERE o.depth < 50
)
SELECT * FROM org;

Koruma 2: Ziyaret Edilen Yol

Daha kesin bir koruma, ziyaret edilen düğümlerin yolunu izler ve yol üzerinde zaten bulunan bir düğüme yeniden girilmesini engeller. Kimlikleri bir dizede (veya dizide) biriktirin ve özyinelemeye geçmeden önce üyeliği denetleyin.

Bu yöntem, meşru ağaçlarda keyfi derinliğe izin verirken döngüleri tam olarak durdurur.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id,
           CAST(',' || id || ',' AS VARCHAR(2000)) AS path
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id,
           o.path || e.id || ','
    FROM employees e JOIN org o ON e.manager_id = o.id
    WHERE o.path NOT LIKE '%,' || e.id || ',%'
)
SELECT id, name, path FROM org;

Yol Denetimi Neden Çalışır

path NOT LIKE '%,' || e.id || ',%' koşulu, "çocuk kimliği zaten yol üzerinde değilse bu kenarı izleyin" anlamına gelir. Virgüller ayraç görevi görür; böylece 1 kimliği, 15 kimliğinin içinde yanlışlıkla eşleşmez.

Bir döngü bir düğümü yeniden ziyaret edecekse WHERE işlemi bu satırı filtreler, özyinelemeli üye sonunda hiçbir şey döndürmez ve özyineleme düzgün biçimde sona erer.

Koruma 3: Yerel CYCLE Yan Tümcesi

Modern Postgres (14 ve sonrası) ile SQL standardı, yol denetimini otomatikleştiren ve döngüleri sizin için işaretleyen yerleşik bir CYCLE yan tümcesi sunar. Motor desteklediğinde en temiz yanıt budur.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id
    FROM employees e JOIN org o ON e.manager_id = o.id
)
CYCLE id SET is_cycle USING cycle_path
SELECT id, name, is_cycle FROM org;

SQL Server'ın MAXRECURSION Sınırı

SQL Server varsayılan olarak 100 özyineleme düzeyini sınırlar. Bir döngü (veya derin bir ağaç) bu sınırı aşarsa sorgu sonsuza kadar döngüye girmek yerine hata verir — bu, örtük bir güvenlik valfidir.

Bu sınırı, 0'ın sınırsız anlamına geldiği OPTION (MAXRECURSION n) ile yükseltebilir veya kaldırabilirsiniz. Ancak yol koruması olmadan sınırı kaldırmak, döngülü verilerde sonsuz döngü riskini yeniden ortaya çıkarır.

-- Cap recursion at 200 levels in SQL Server
SELECT * FROM org
OPTION (MAXRECURSION 200);

Döngüleri Algılama ve Önleme

Mülakatçılar iki amacı birbirinden ayırabilir:

  • Önleme — sorgunun tamamlanabilmesi için döngü oluşturan kenarı sessizce atlamak (yol denetiminin WHERE işlemi).
  • Algılama ve bildirme — veri ekibinin hatalı verileri düzeltebilmesi için hangi satırların bir döngünün parçası olduğunu göstermek (CYCLE yan tümcesinin is_cycle işareti).

Her ikisini ve hangisinin ne zaman uygun olduğunu bilmek, kıdemli düzeyde bir ayrımdır.

Performansla İlgili Noktalar

Döngüler olmasa bile özyineleme pahalı olabilir. Mülakatçıların duymaktan hoşlandığı ipuçları:

  • Her yinelemedeki birleştirmenin hızlı olması için birleştirme sütununu (ör. manager_id) dizinleyin.
  • Tüm tablo yerine yalnızca ihtiyacınız olan alt ağacı başlangıç olarak almak için başlangıç üyesinde erken filtreleme yapın.
  • SELECT * kullanmaktan kaçının — yalnızca özyinelemenin gerektirdiği sütunlarla birlikte depth/path değerlerini taşıyın.

Güvenli Bir Şablon

Koruma yöntemlerini, baskı altında yeniden oluşturabileceğiniz bir şablonda birleştirin: geri durdurma mekanizması olarak derinlik sütunu, kesin koruma olarak yol denetimi. Temiz veriler için korumalardan biri gereğinden fazla olsa bile ikisini de göstermek titizliğinizi ortaya koyar.

WITH RECURSIVE walk AS (
    SELECT id, parent_id, 1 AS depth,
           CAST(',' || id || ',' AS VARCHAR(4000)) AS path
    FROM nodes WHERE parent_id IS NULL
    UNION ALL
    SELECT n.id, n.parent_id, w.depth + 1,
           w.path || n.id || ','
    FROM nodes n JOIN walk w ON n.parent_id = w.id
    WHERE w.depth < 100
      AND w.path NOT LIKE '%,' || n.id || ',%'
)
SELECT id, depth FROM walk;

Yaygın Mülakat Hataları

Kaçınmanız gereken son tuzaklar:

  • SQL Server'da başka bir koruma olmadan MAXRECURSION sınırını kaldırmak — sonsuz döngü riskini yeniden açar.
  • Yol dizesi sütununun çok kısa tanımlanması; bu, kesilmeye ve korumanın sessizce bozulmasına neden olur.
  • Kimlikleri virgül ayraçları olmadan eşleştirmek; böylece 1 kimliği, 21 kimliğinin içinde yanlışlıkla eşleşir.
  • Verilerin yalnızca "öyle olması gerektiği" için döngüsüz olduğunu varsaymak — bunu her zaman sorgulayın.

Hızlı Kontrol

Meşru derinliği sınırlamadan döngüleri tam olarak durduran korumayı seçin.

Özet

Her özyinelemeli CTE çözümü güvenlik konusunu ele almalıdır:

  • Döngüler, özyinelemeli üyenin hiçbir zaman boş dönmemesine ve bu nedenle özyinelemenin hiç durmamasına neden olur.
  • Derinlik sınırı = hızlı bir son güvence; ziyaret edilen yol denetimi = kesin döngü önleme; CYCLE yan tümcesi = modern motorlarda yerel algılama.
  • SQL Server'ın MAXRECURSION 100 değeri örtük bir valftir — başka bir koruma olmadan bunu kaldırmayın.
  • Performans için birleştirme sütununu dizinleyin ve dar kapsamlı bir başlangıç seçin.

Artık özyinelemeli CTE'leri baştan sona yazabilir, bunlarda gezinebilir, veri üretebilir ve güvenli hâle getirebilirsiniz.

Sıkça Sorulan Sorular

“Sonsuz Özyinelemeden Kaçınma” dersi ücretsiz mi?

Evet — “Sonsuz Özyinelemeden Kaçınma” 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.

“Sonsuz Özyinelemeden Kaçınma” dersinde ne öğreneceğim?

Döngü algılama, derinlik sınırları ve her mülakatçının kontrol ettiği özyineleme korumasını öğrenin. 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 4. dersidir.

“Sonsuz Özyinelemeden Kaçınma” 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. Çapa ve Özyinelemeli Üyeler
  2. Kuruluş Şemasını Dolaşma
  3. Sayı ve Tarih Serileri Oluşturma
  4. Sonsuz Özyinelemeden Kaçınma
← SQL Interview Prep Sayfasına Dön