0Pricing
SQL Interview Prep · Pelajaran

Menghindari Rekursi Tak Terbatas

Deteksi siklus, batas kedalaman, dan penjaga rekursi yang selalu diperiksa pewawancara.

Menghindari Rekursi Tak Terbatas adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.

Pertanyaan di Balik Pertanyaan

Setelah Anda menulis CTE rekursif, pewawancara yang tajam akan bertanya: "Apa yang terjadi jika data memiliki cycle?" Ini menguji apakah Anda memahami bahwa rekursi dapat berjalan selamanya — dan apakah Anda tahu cara mengatasinya.

cycle terjadi ketika hierarki berputar kembali ke dirinya sendiri: A melapor kepada B, dan B melapor kepada A. Anggota rekursif yang naif akan terus berpindah di antara keduanya tanpa batas.

Cara cycle Terbentuk

Pohon seharusnya tidak memiliki cycle, tetapi data nyata sering kali berantakan. Pemutakhiran yang keliru dapat menetapkan seorang karyawan sebagai manajer tidak langsung bagi dirinya sendiri. Graf — seperti "pengguna yang mengikuti pengguna lain" — secara alami dapat memiliki cycle.

Ketika anggota rekursif menemukan kembali simpul yang sudah dikunjunginya, anggota tersebut menghasilkan simpul itu lagi, yang kemudian memicu kembali simpul-simpul turunannya, dan putaran itu tidak pernah kosong. Rekursi hanya berhenti ketika suatu langkah tidak mengembalikan baris; cycle menjamin bahwa langkah tersebut selalu mengembalikan baris.

Pengaman 1: Batas Kedalaman

Pengaman paling sederhana adalah penghitung kedalaman dengan batas dalam anggota rekursif. Meskipun terdapat cycle, rekursi akan berhenti saat mencapai batas tersebut.

Ini adalah cara yang kasar — pohon valid yang sangat dalam juga akan dibatasi — tetapi cepat dan mudah digunakan dalam wawancara.

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;

Pengaman 2: Jalur yang Telah Dikunjungi

Pengaman yang lebih tepat melacak jalur simpul yang telah dikunjungi dan menolak untuk memasuki kembali simpul yang sudah ada di jalur tersebut. Kumpulkan identitas ke dalam string (atau larik), lalu periksa keanggotaannya sebelum melakukan rekursi.

Cara ini menghentikan cycle secara tepat, sekaligus tetap memungkinkan kedalaman berapa pun pada pohon yang valid.

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;

Mengapa Pemeriksaan Jalur Berhasil

Kondisi path NOT LIKE '%,' || e.id || ',%' berarti "ikuti sisi ini hanya jika identitas anak belum ada di dalam jalur." Koma berfungsi sebagai pemisah agar identitas 1 tidak keliru dianggap cocok di dalam identitas 15.

Jika cycle menyebabkan sebuah simpul dikunjungi kembali, WHERE menyaring baris tersebut, anggota rekursif pada akhirnya tidak mengembalikan apa pun, dan rekursi berhenti dengan bersih.

Pengaman 3: Klausa CYCLE Bawaan

Postgres modern (14+) dan standar SQL menyediakan klausa CYCLE bawaan yang mengotomatiskan pemeriksaan jalur dan menandai cycle untuk Anda. Ini adalah jawaban paling rapi jika mesin basis data mendukungnya.

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;

MAXRECURSION pada SQL Server

SQL Server memberlakukan batas bawaan sebesar 100 tingkat rekursi. Jika cycle (atau pohon yang sangat dalam) melampauinya, kueri gagal dengan kesalahan, bukan berjalan selamanya — ini menjadi katup pengaman implisit.

Anda dapat menaikkan atau menghapus batas tersebut dengan OPTION (MAXRECURSION n), dengan 0 berarti tanpa batas. Namun, menghapus batas tanpa pengaman jalur akan mengembalikan risiko putaran tak terbatas pada data yang memiliki cycle.

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

Mendeteksi vs Mencegah cycle

Pewawancara mungkin membedakan dua tujuan:

  • Cegah — lewati sisi yang membentuk cycle secara diam-diam agar kueri selesai (klausa WHERE yang memeriksa jalur).
  • Deteksi dan laporkan — tampilkan baris mana yang merupakan bagian dari cycle agar tim data dapat memperbaiki data yang bermasalah (tanda is_cycle dari klausa CYCLE).

Mengetahui keduanya dan memahami kapan masing-masing tepat digunakan merupakan pembedaan tingkat senior.

Pertimbangan Kinerja

Rekursi dapat membutuhkan banyak sumber daya bahkan tanpa cycle. Berikut kiat yang biasanya ingin didengar pewawancara:

  • Buat indeks pada kolom penggabungan (misalnya manager_id) agar penggabungan pada setiap iterasi berlangsung cepat.
  • Lakukan penyaringan lebih awal di anchor agar hanya subpohon yang diperlukan yang dijadikan nilai awal, bukan seluruh tabel.
  • Hindari SELECT * — bawa hanya kolom yang diperlukan rekursi, ditambah depth dan path.

Templat yang Aman

Gabungkan semua pengaman ke dalam templat yang dapat Anda tulis ulang saat berada di bawah tekanan: kolom kedalaman sebagai pengaman cadangan, dan pemeriksaan jalur sebagai pengaman yang tepat. Meskipun salah satunya berlebihan untuk data yang bersih, menunjukkan keduanya menandakan ketelitian.

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;

Jebakan Umum dalam Wawancara

Jebakan terakhir yang harus dihindari:

  • Menghapus MAXRECURSION pada SQL Server tanpa pengaman lain — hal ini membuka kembali risiko putaran tak terbatas.
  • Kolom string jalur dideklarasikan terlalu pendek, sehingga terjadi pemotongan dan pengaman rusak tanpa terlihat.
  • Mencocokkan identitas tanpa pemisah koma, sehingga identitas 1 keliru dianggap cocok di dalam identitas 21.
  • Menganggap data tidak memiliki cycle hanya karena data itu "seharusnya" demikian — selalu periksa.

Pemeriksaan Singkat

Pilih pengaman yang menghentikan cycle secara tepat tanpa membatasi kedalaman yang valid.

Ringkasan

Setiap jawaban tentang CTE rekursif harus membahas keselamatan:

  • cycle membuat anggota rekursif tidak pernah mengembalikan hasil kosong, sehingga rekursi tidak pernah berhenti.
  • Batas kedalaman = pengaman cadangan yang cepat; pemeriksaan jalur yang telah dikunjungi = pencegahan cycle yang tepat; klausa CYCLE = deteksi bawaan pada mesin basis data modern.
  • MAXRECURSION 100 pada SQL Server adalah katup implisit — jangan menghapusnya tanpa pengaman lain.
  • Buat indeks pada kolom penggabungan dan gunakan nilai awal yang terbatas untuk meningkatkan kinerja.

Sekarang Anda dapat menulis, menelusuri, menghasilkan, dan mengamankan CTE rekursif dari awal hingga akhir.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menghindari Rekursi Tak Terbatas” gratis?

Ya — teks lengkap “Menghindari Rekursi Tak Terbatas” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menghindari Rekursi Tak Terbatas”?

Deteksi siklus, batas kedalaman, dan penjaga rekursi yang selalu diperiksa pewawancara. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?

Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Menghindari Rekursi Tak Terbatas” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?

Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Anggota Anchor dan Rekursif
  2. Menelusuri Bagan Organisasi
  3. Membuat Deret Angka dan Tanggal
  4. Menghindari Rekursi Tak Terbatas
← Kembali ke SQL Interview Prep