Back to IF3140 Sistem Basis Data

Topic

Questions/Cues

  • Apa saja algoritma join utama?

  • Bagaimana cara kerja Nested-Loop Join?

  • Apa itu Block Nested-Loop Join?

  • Kapan Indexed Nested-Loop Join efisien?

  • Bagaimana prinsip Merge-Join?

  • Apa itu Hash-Join?

  • Fase Partisi vs. Build/Probe di Hash-Join?

  • Bagaimana menangani overflow pada Hash-Join?

  • Apa itu Hybrid Hash-Join?

  • Cara menangani join kompleks (AND/OR)?

Reference Points

  • Slides 26-44

Nested-Loop Join

Ini adalah algoritma join yang paling dasar dan sederhana.

  • Cara Kerja: Untuk setiap tuple di relasi luar (r), pindai seluruh relasi dalam (s) untuk mencari pasangan yang memenuhi kondisi join.

  • Kelebihan: Dapat digunakan untuk semua jenis kondisi join (tidak hanya kesetaraan) dan tidak memerlukan indeks.

  • Kekurangan: Sangat tidak efisien dan mahal.

  • Estimasi Biaya (Worst Case): blok seek time, di mana adalah jumlah record di relasi r dan adalah jumlah blok di relasi s.

  • Best Case: Jika relasi luar sangat kecil.

  • Worst Case: Jika dan sama-sama besar.

Block Nested-Loop Join

Merupakan variasi dari Nested-Loop Join yang bekerja pada level blok, bukan tuple.

  • Cara Kerja: Untuk setiap blok di relasi luar (r), pindai seluruh blok di relasi dalam (s). Kemudian, untuk setiap pasang blok, semua kombinasi tuple di dalamnya akan diperiksa.

  • Estimasi Biaya (Worst Case):

  • Optimasi: Alokasikan blok memori untuk relasi luar, sehingga dapat membaca blok sekaligus dan mengurangi jumlah pemindaian relasi dalam. Biaya menjadi .

  • Best Case: Jika relasi luar yang dipilih sangat kecil, sehingga muat dalam memori yang tersedia ().

  • Worst Case: Jika dan sama-sama besar.

Indexed Nested-Loop Join

Algoritma ini memanfaatkan indeks pada atribut join dari relasi dalam untuk mempercepat pencarian.

  • Syarat: Kondisi join harus berupa equi-join (atau natural join) dan harus ada indeks pada atribut join relasi dalam.

  • Cara Kerja: Untuk setiap tuple di relasi luar (r), gunakan indeks pada relasi dalam (s) untuk langsung menemukan tuple yang cocok, tanpa perlu memindai seluruh relasi s.

  • Estimasi Biaya: , di mana c adalah biaya untuk mencari dan mengambil semua tuple yang cocok di s untuk satu tuple r menggunakan indeks.

  • Best Case: Jika relasi luar sangat kecil DAN indeks yang dipilih sangat selektif pada atribut join di relasi dalam .

  • Worst Case: Jika indeks relasi dalam TIDAK selektif.

Merge-Join

Algoritma ini efisien untuk equi-joins dan natural joins.

  • Cara Kerja:

    1. Sort: Urutkan kedua relasi (r dan s) berdasarkan atribut join mereka.

    2. Merge: Pindai kedua relasi yang sudah terurut secara bersamaan (mirip fase merge pada External Sort-Merge) untuk menemukan tuple yang cocok. Pointer akan bergerak maju secara sinkron di kedua relasi.

  • Estimasi Biaya (jika relasi sudah terurut): transfer blok, karena setiap blok hanya perlu dibaca sekali. Jika belum terurut, biaya sorting harus ditambahkan.

  • Best Case: Jika relasi luar dan relasi dalam sudah terurut.

  • Worst Case: Jika dan tidak terurut.

  • Secara umum:

Hash-Join

Ini adalah algoritma yang sangat efisien untuk equi-joins, terutama pada data besar.

  • Cara Kerja:

    1. Fase Partisi (Partition Phase):

      • Pilih relasi yang lebih kecil sebagai build input (misalnya s).

      • Gunakan fungsi hash h1 pada atribut join untuk mempartisi s dan r ke dalam n bucket atau partisi ( dan ).

      • Tulis partisi-partisi ini ke disk. Keuntungannya adalah tuple di hanya mungkin cocok dengan tuple di .

    2. Fase Build & Probe (Matching Phase):

      • Untuk setiap partisi i:
        1. Build: Baca partisi ke memori dan bangun hash table di memori menggunakan fungsi hash kedua ().

        2. Probe: Baca partisi blok per blok, dan untuk setiap tuple, gunakan h2 untuk mencari pasangannya di hash table .

  • Penanganan Overflow: Jika partisi tidak muat di memori, partisi tersebut dapat dipartisi ulang secara rekursif menggunakan fungsi hash lain, atau gunakan Block Nested-Loop Join untuk partisi yang meluap tersebut.

  • Estimasi Biaya (tanpa rekursi): Sekitar

  • Best Case: Paling baik untuk operasi equi-join pada data besar dengan memori yang cukup, dan ketika fungsi hash mampu mendistribusikan kunci join secara merata ke semua partisi. Distribusi yang merata memastikan tidak ada partisi yang “meluap” (overflow) dan setiap partisi dari relasi build (​) bisa dimuat ke memori saat fase probe. Varian Hybrid Hash-Join memberikan optimasi lebih lanjut dalam skenario ini.

  • Worst Case: Ketika terjadi kemiringan data (data skew) yang signifikan pada atribut join. Ini berarti banyak sekali record memiliki nilai atribut join yang sama. Akibatnya, fungsi hash akan menempatkan semua record tersebut ke dalam satu partisi yang sama.

Hybrid Hash-Join

Sebuah optimasi dari Hash-Join ketika memori cukup besar.

  • Cara Kerja: Selama fase partisi build input (s), partisi pertama () tidak ditulis ke disk, melainkan langsung disimpan di memori sebagai hash table. Ketika probe input (r) dipartisi, tuple yang masuk ke partisi tidak ditulis ke disk, melainkan langsung digunakan untuk mencari pasangan di hash table . Ini menghemat I/O untuk satu partisi penuh.

Complex Joins

  • Join dengan Kondisi Konjungtif (AND):

    • Hitung join untuk kondisi yang paling selektif (misalnya ), lalu terapkan kondisi sisanya () sebagai filter pada hasilnya.
  • Join dengan Kondisi Disjungtif (OR):

    • Hitung hasil join untuk setiap kondisi secara terpisah (dan).

    • Gabungkan hasilnya menggunakan operasi UNION.

Summary

Pemilihan algoritma join adalah salah satu keputusan paling kritis dalam optimasi query, dengan setiap algoritma memiliki kelebihan pada skenario yang berbeda. Nested-Loop Join adalah metode universal tetapi lambat. Block Nested-Loop Join memberikan perbaikan sederhana. Indexed Nested-Loop Join sangat cepat jika tersedia indeks yang sesuai. Merge-Join efisien untuk equi-join pada data yang sudah atau dapat diurutkan dengan mudah. Terakhir, Hash-Join seringkali menjadi pilihan tercepat untuk equi-join pada data besar, dengan varian Hybrid Hash-Join yang lebih lanjut mengoptimalkan penggunaan memori untuk mengurangi I/O disk.