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
WHEREyang memeriksa jalur). - Deteksi dan laporkan — tampilkan baris mana yang merupakan bagian dari cycle agar tim data dapat memperbaiki data yang bermasalah (tanda
is_cycledari klausaCYCLE).
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, ditambahdepthdanpath.
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
MAXRECURSIONpada 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 100pada 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
- Anggota Anchor dan Rekursif
- Menelusuri Bagan Organisasi
- Membuat Deret Angka dan Tanggal
- Menghindari Rekursi Tak Terbatas