Π notsp,tgl_lhr(peserta)
HASIL DAN PEMBAHASAN
4.2.2. Analisis Optimisasi Secara Spesifik
4.2.3.5 Hash Join
Algoritma Hash join, seperti algoritma sort-merge-join, yaitu mengidentifikasi partisi dalam P dan F dalam tiap partisi dan dalam tahap equality
berikutnya membandingkan record dalam partisi P hanya dengan record dalam F yang sesuai untuk menguji syarat equality join. Berbeda dengan sort-merge-join, hash join menggunakan hashing untuk mengidentifikasi partisi dalam pengurutan. Tahap partisi ini dapat disebut juga sebagai building dari hasil hash join serupa dengan partisi dalam proyeksi hash based dan diilustrasikan dalam Gambar 15, dan tahap equality atau disebut matching diilustrasikan dalam Gambar 16.
Gambar 15: Tahap Partisi Proyeksi Hash-Based. (Raghu 2003)
Gambar di atas menandakan bahwa jika terdapat sejumlah besar (misalkan B halaman buffer relatif) dengan jumlah halaman P, maka pendekatan hash-based sangat perlu, karena terdapat dua tahap pekerjaan yaitu : partisi dan eliminasi duplikat.
Dalam tahap partisi dipunyai satu halaman buffer input dari B-1 halaman buffer output. Relasi P dibaca ke dalam halaman buffer input, setiap satu halaman. Halaman input diproses sebagai berikut : Untuk tiap record, diproyeksikan sesuai atribut yang diinginkan, dan kemudian mengaplikasikan fungsi hash h pada kombinasi dari semua atribut yang ada. Fungsi h dipilih sehingga record didistribusikan secara seragam pada satu B-1 partisi; dan terdapat satu halaman output per partisi. Setelah proyeksi record diisi ke halaman buffer output yang di hash menurut h.
Pada akhir tahap partisi, mempunyai B-1 partisi, masing-masing berisi kumpulan record menggunakan nilai hash umum (dihitung dengan mengaplikasikan h pada semua field, dan hanya mempunyai field yang diinginkan. Dua record yang tercakup dalam partisi yang berbeda dijamin tidak menjadi duplikat karena mereka mempunyai nilai hash yang berbeda. Jadi jika
* * *
*** * * *
Input
Fungsi hash h
Partisi Orisinil Partisi
disk Buffer memory utama B disk
B-1 1 2 B-1 1 2
dua record merupakan duplikat, maka mereka berada dalam partisi yang sama. Dalam tahap eliminasi duplikat dibaca B-1 partisi satu per satu untuk menghilangkan duplikat, dasar pemikirannya adalah membentuk in-memory hash tabel seperti memproses record untuk mendeteksi duplikat. Untuk tiap partisi dihasilkan dalam tahap pertama :
1. Baca partisi satu halaman per satu waktu. Hash tiap record dengan mengaplikasikan fungsi hash h2 ( ≠ h ) pada kombinasi dari semua field dan kemudian menyisipkannya ke dalam in-memory hash tabel. Jika record baru meng-hash nilai yang sama seperti beberapa record yang ada, maka bandingkan keduanya untuk memeriksa apakah record baru tersebut merupakan duplikat, buang duplikat saat ditemukan.
2. Setelah semua partisi telah dibaca, tulis record dalam hash tabel (dimana tidak terdapat duplikat) ke file hasil, kemudian bersihkan in-memory hash tabel untuk mempersiapkan partisi berikutnya.
Untuk persoalan join idenya adalah meng-hash kedua relasi pada atribut join, menggunakan fungsi hash h yang sama. Jika meng-hash tiap relasi (idealnya secara seragam) ke dalam k partisi, maka yakin bahwa record P dalam partisi i hanya dapat join dengan record F dalam partisi j yang sama. Pengamatan ini dapat digunakan untuk pengaruh yang baik, yaitu dapat membaca dalam partisi secara lengkap dari relasi P yang lebih kecil dan hanya men-scan partisi sesuai dengan F untuk kesesuaian. Dan selanjutnya tidak perlu memperhatikan record P
dan F lagi. Jadi setelah P dan F di partisi, maka dapat dilakukan join dengan
hanya membaca P dan F sebanyak satu kali saja. Dan menyediakan memory yang
cukup diperkenankan untuk menyimpan semua record dalam partisi P tertentu. Dalam praktek sistem membentuk in-memory hash tabel untuk partisi P, menggunakan fungsi hash h2 yang berbeda dari h ( karena h2 dimaksudkan untuk mendistribusi record dalam partisi yang berdasarkan h ), untuk mengurangi biaya CPU. Hal ini sangat memerlukan memory yang cukup untuk memegang hash tabel, yang sedikit lebih besar daripada partisi P itu sendiri.
Gambar 16: Tahap equality join menggunakan Hash-Join.(Raghu 2003)
Algoritma hash join dipresentasikan pada Gambar 17, perhatikan biaya algoritma hash join. Dalam tahap partisi harus men-scan P dan F sekali dan menulisnya sekali. Oleh karena itu biaya tahap ini adalah 2 ( M + N ). Pada tahap kedua men-scan tiap partisi sekali, dengan asumsi bahwa tidak terdapat partisi overflow, dengan besar biayanya adalah :
( M + N ) I/O
sehingga dengan demikian biaya total adalah : 3 ( M + N )
dengan asumsi bahwa tiap partisi dapat dimasukkan dalam memory pada tahap kedua. Pada contoh join dari pst_ke1 dan pstaktif biaya total adalah :
3 * ( 38.733 + 45.242) = 251.925 halaman I/O.
Apabila unjuk kerja komputer diasumsikan 10 ms per I/O, hash join memerlukan waktu sebesar:
251.925 * 0,0000028 = 0,699791667 jam
hal tersebut dikarenakan algoritma hash join memanfaatkan buffer ekstra (in-memory) dan menggunakan variabel dinamis dimana memory yang sudah tidak digunakan dapat dibersihkan.
* * *
*** ***
Buffer Input
Untuk men-scan Fi Buffer output
Hash tabel untuk partisi P1 { k < B -1 halaman}
Partisi P dan F Hasil join
disk Buffer memory utama B disk
Fungsi hash h2
Dari hasil analisis di atas jelas terlihat bahwa algoritma mem-partisi tabel-tabel relasi dengan menggunakan metode hash join secara parsial dapat menunjukkan unjuk kerja query secara signifikan. Tetapi prinsip Hash Based harus dirancang sebelum aplikasi digunakan, karena tabel-tabel relasi harus berupa “hash tabel” yang mana terdapat fungsi hash berupa variabel pointer yang dapat menunjuk langsung pada alamat tertentu sesuai keperluan yang dilakukan dalam hash join,
// partition P into k partitions foreach record p ∈ P do
read p and it to buffer page h(pi); // flushed as page fills // Partition F into k partitions
foreach record f ∈ F do
read f and it to buffer page h(fj); // flushed as page fills // Probing phase
for l=1,... , k do {
// build in memory hash tabel for Pi, using h2 foreach tuple p ∈ Partition Pi do
read p and insert into hash table using h2(pi); // Scan Fl and Probe for matching Pi record
foreach record f ∈ Partition Fj do { read f and probe tabel using h2 ( fj ); for matching P record p, output (p,f) } clear hash tabel to prepare for next partition; }
Gambar 17. Algoritma Hash-Join (Raghu 2003)