0Pricing
Coding Interview Prep · Pelajaran

Algoritme Penggabungan: Nested Loop, Hash, Merge

Cara setiap penggabungan dijalankan dan kapan masing-masing menjadi pilihan yang tepat.

Algoritme Penggabungan: Nested Loop, Hash, Merge adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 3 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 Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Penggabungan Adalah Algoritme, Bukan Sekadar Sintaks

Anda sudah mengenal INNER JOIN sebagai sintaks. Pada tingkat senior, pewawancara menanyakan bagaimana basis data menjalankan penggabungan secara fisik. Ada tiga algoritme:

  • Penggabungan Perulangan Bersarang
  • Penggabungan Hash
  • Penggabungan dengan Pengurutan (pengurutan-penggabungan)

Jenis penggabungan logis (INNER, LEFT) tidak bergantung pada algoritmenya. Perencana memilih algoritme berdasarkan ukuran tabel, indeks, dan urutan pengurutan. Mengetahui kapan masing-masing algoritme unggul merupakan inti pelajaran ini.

Penggabungan Perulangan Bersarang

Perulangan Bersarang adalah algoritme paling sederhana: untuk setiap baris tabel luar, pindai tabel dalam untuk mencari kecocokan. Dalam kode semu, ada dua perulangan, satu di dalam yang lain.

Secara naif, kompleksitasnya adalah O(luar * dalam), sehingga sangat buruk untuk tabel besar. Namun, algoritme ini menjadi sangat baik ketika sisi dalam memiliki indeks pada kunci penggabungan: setiap baris luar memicu pencarian indeks yang murah, bukan pemindaian penuh pada tabel dalam.

Algoritme ini menjadi pilihan favorit perencana ketika tabel luar berukuran kecil dan kolom penggabungan di tabel dalam memiliki indeks.

Nested Loop  (cost=0.42..120.5 rows=15 width=72)
  ->  Seq Scan on customers c  (rows=3)
  ->  Index Scan using idx_orders_cust on orders o
        Index Cond: (o.customer_id = c.id)
        (loops=3)

Membaca Perulangan dalam Penggabungan Perulangan Bersarang

Tanda khas perulangan bersarang adalah adanya loops pada simpul dalam. Contoh ini menampilkan loops=3 karena sisi luar menghasilkan 3 baris, sehingga pemindaian indeks di sisi dalam berjalan 3 kali.

Bahaya muncul ketika sisi luar berukuran besar. Jika sisi luar menghasilkan 2 juta baris, sisi dalam berjalan 2 juta kali. Bahkan pencarian cepat selama 0.01ms pun menjadi 20 detik.

Dalam wawancara, tandai setiap perulangan bersarang yang nilai loops-nya besar pada tabel dalam tanpa indeks yang baik; itulah kueri yang lambat.

Penggabungan Hash

Penggabungan Hash cocok untuk tabel besar yang belum diurutkan. Algoritme ini berjalan dalam dua fase:

  • Pembangunan: baca tabel yang lebih kecil dan muat ke dalam tabel hash di memori, dengan kunci kolom penggabungan.
  • Penyelidikan: pindai tabel yang lebih besar; untuk setiap baris, buat hash dari kunci penggabungan lalu cari hasilnya di tabel hash.

Setiap tabel hanya dibaca sekali, sehingga kompleksitasnya kira-kira O(luar + dalam). Algoritme ini tidak memerlukan indeks maupun masukan yang sudah diurutkan, sehingga menjadi pilihan utama untuk penggabungan analitik berukuran besar dengan kondisi kesetaraan.

Hash Join  (cost=18.0..520.0 rows=900 width=72)
  Hash Cond: (o.customer_id = c.id)
  ->  Seq Scan on orders o  (rows=100000)
  ->  Hash  (rows=500)
        ->  Seq Scan on customers c  (rows=500)

Batasan Penggabungan Hash

Ada dua hal yang harus Anda sebutkan tentang penggabungan hash:

  • Algoritme ini hanya bekerja untuk kondisi penggabungan berupa kesetaraan (a.id = b.id). Kondisi rentang seperti a.x < b.y tidak dapat menggunakan penggabungan hash.
  • Sisi pembangunan harus dapat dimuat dalam work_mem. Jika tidak, Postgres menulis batch sementara ke disk (Anda akan melihat Batches: > 1 dan penggunaan disk), sehingga penggabungan menjadi sangat lambat.

Jadi, penggabungan hash dengan sisi pembangunan yang sangat besar dan work_mem yang sangat kecil merupakan bug kinerja di dunia nyata yang perlu Anda soroti.

Hash  (actual rows=2000000 loops=1)
  Buckets: 65536  Batches: 16  Memory Usage: 4096kB

Penggabungan dengan Pengurutan

Penggabungan dengan Pengurutan (pengurutan-penggabungan) memerlukan kedua masukan sudah diurutkan berdasarkan kunci penggabungan. Algoritme ini kemudian menelusuri keduanya secara beriringan, seperti menggabungkan dua daftar terurut, dengan memajukan penunjuk yang masih tertinggal.

Algoritme ini efisien ketika masukan sudah diurutkan, misalnya langsung berasal dari indeks dalam urutan kunci, karena tidak diperlukan langkah pengurutan. Algoritme ini juga mendukung penggabungan rentang dan ketidaksetaraan, tidak seperti penggabungan hash.

Jika masukan belum diurutkan sebelumnya, perencana menambahkan simpul Sort secara eksplisit, dan biaya pengurutan tersebut mungkin membuat penggabungan hash lebih murah.

Merge Join  (cost=0.85..210.0 rows=900 width=72)
  Merge Cond: (o.customer_id = c.id)
  ->  Index Scan using idx_orders_cust on orders o
  ->  Index Scan using customers_pkey on customers c

Panduan Singkat Memilih

Hafalkan kapan masing-masing algoritme unggul:

  • Perulangan Bersarang, untuk tabel luar berukuran kecil dan kunci penggabungan di tabel dalam yang memiliki indeks; juga merupakan satu-satunya pilihan untuk penggabungan non-kesetaraan tanpa masukan yang sudah diurutkan.
  • Penggabungan Hash, untuk tabel besar yang belum diurutkan dan digabungkan berdasarkan kesetaraan; tidak memerlukan indeks.
  • Penggabungan dengan Pengurutan, ketika kedua masukan sudah diurutkan berdasarkan kuncinya, sering kali melalui indeks, atau untuk penggabungan rentang; sangat baik untuk kumpulan data yang sangat besar dan sudah diurutkan.

Perencana memperkirakan biaya setiap algoritme dan memilih yang termurah berdasarkan perkiraan jumlah barisnya.

Penggunaan Memori dan Biaya Pengurutan

Penggunaan sumber daya sangat berbeda, dan pewawancara sering menguji pemahaman ini:

  • Perulangan Bersarang, memerlukan memori minimal; biayanya didominasi oleh pencarian di sisi dalam yang dilakukan berulang kali.
  • Penggabungan Hash, memerlukan memori untuk tabel hash; menulis data sementara ke disk jika ukurannya terlalu besar.
  • Penggabungan dengan Pengurutan, murah saat penggabungan, tetapi mahal jika harus mengurutkan terlebih dahulu; pengurutan juga menggunakan work_mem dan dapat menulis data sementara ke disk.

Jadi, menaikkan work_mem dapat mengubah penggabungan hash atau pengurutan yang lambat karena menulis ke disk menjadi operasi dalam memori. Ini merupakan jawaban optimasi yang konkret.

Kesalahan pada Perulangan Bersarang

Kasus klasik: sebuah kueri cepat di lingkungan pengembangan, tetapi lambat di produksi. Rencana menunjukkan Perulangan Bersarang dengan loops=3000000.

Perencana meremehkan jumlah baris luar (statistik usang menyatakan 3 baris, sedangkan kenyataannya 3 juta), sehingga memilih perulangan bersarang. Dengan statistik yang akurat, perencana akan memilih penggabungan hash.

Jawaban Anda dalam wawancara: jalankan ANALYZE agar perkiraannya benar; perencana kemudian akan beralih ke penggabungan hash dan kueri akan menjadi jauh lebih cepat.

Nested Loop  (cost=0.42..50.0 rows=3 width=72)
  ->  Seq Scan on big_outer  (actual rows=3000000 loops=1)
  ->  Index Scan on inner_t  (actual rows=1 loops=3000000)

Mengarahkan Pilihan

Biasanya Anda sebaiknya tidak memaksa algoritme, tetapi Anda dapat melakukannya saat pengujian untuk membandingkan hasilnya. Postgres menyediakan sakelar per metode:

SET enable_nestloop = off; dan sakelar serupa untuk enable_hashjoin serta enable_mergejoin. Matikan salah satunya, jalankan kembali EXPLAIN ANALYZE, lalu amati apakah alternatif tersebut benar-benar lebih cepat.

Perbaikan yang tepat tetap meliputi statistik terbaru, indeks yang sesuai, work_mem yang memadai, dan predikat selektif. Pemaksaan hanya untuk diagnosis.

SET enable_nestloop = off;
EXPLAIN ANALYZE
SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id;
SET enable_nestloop = on;

Ringkasan Penggabungan pada Skala Besar

Satukan semuanya untuk beban kerja analitik yang menggabungkan dua tabel fakta dan dimensi berukuran besar berdasarkan sebuah pengenal:

  • Jika tabel dimensi dapat dimuat ke memori, perkirakan Penggabungan Hash, yang sering kali menjadi pilihan terbaik.
  • Jika keduanya datang dalam keadaan terurut dari indeks, Penggabungan dengan Pengurutan dapat menghindari pembangunan tabel hash.
  • Perulangan Bersarang dalam situasi ini merupakan tanda bahaya, yang biasanya disebabkan oleh perkiraan yang buruk.

Membaca penggabungan mana yang dipilih perencana dan menilai apakah pilihan itu seharusnya demikian merupakan sinyal tingkat senior yang tepat yang diuji oleh pertanyaan-pertanyaan ini.

Pemeriksaan Cepat

Anda menggabungkan dua tabel besar yang belum diurutkan berdasarkan kondisi kesetaraan a.id = b.id, tidak ada yang memiliki indeks yang berguna, dan statistiknya akurat. Algoritme penggabungan mana yang kemungkinan besar akan dipilih perencana?

Rekapitulasi

Tiga algoritme penggabungan:

  • Perulangan Bersarang, jumlah baris luar dikalikan pencarian di sisi dalam; sangat baik jika sisi luar kecil dan kunci sisi dalam memiliki indeks, tetapi berbahaya ketika loops sangat besar.
  • Penggabungan Hash, pembangunan dan penyelidikan; terbaik untuk penggabungan kesetaraan pada tabel besar yang belum diurutkan, hanya berlaku untuk kesetaraan dan dibatasi oleh work_mem.
  • Penggabungan dengan Pengurutan, menelusuri masukan yang sudah diurutkan secara beriringan; ideal ketika data sudah diurutkan atau untuk penggabungan rentang.

Perencana memilih berdasarkan biaya dan statistik. Perulangan bersarang yang mengejutkan dengan jumlah perulangan sangat besar hampir selalu berarti perkiraan jumlah baris yang buruk; perbaiki statistiknya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Algoritme Penggabungan: Nested Loop, Hash, Merge” gratis?

Ya — teks lengkap “Algoritme Penggabungan: Nested Loop, Hash, Merge” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Algoritme Penggabungan: Nested Loop, Hash, Merge”?

Cara setiap penggabungan dijalankan dan kapan masing-masing menjadi pilihan yang tepat. Kamu berlatih Coding 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 Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding 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 3 dari 4.

Berapa lama pelajaran “Algoritme Penggabungan: Nested Loop, Hash, Merge” 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 Coding Interview Prep ini?

Ya. Setiap pelajaran Coding 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. Membaca Rencana EXPLAIN
  2. Seq Scan vs Index Scan vs Index-Only
  3. Algoritme Penggabungan: Nested Loop, Hash, Merge
  4. Menemukan dan Memperbaiki Kueri Lambat
← Kembali ke Coding Interview Prep