Penggabungan "sort merge" dilakukan dengan menyortir dua kumpulan data yang akan digabungkan sesuai dengan kunci gabungan dan kemudian menggabungkannya bersama-sama. Penggabungannya sangat murah, tetapi pengurutannya bisa sangat mahal terutama jika pengurutannya tumpah ke disk. Biaya pengurutan dapat diturunkan jika salah satu kumpulan data dapat diakses dalam urutan yang diurutkan melalui indeks, meskipun mengakses sebagian besar blok tabel melalui pemindaian indeks juga bisa sangat mahal dibandingkan dengan pemindaian tabel penuh. .
Gabungan hash dilakukan dengan meng-hash satu kumpulan data ke dalam memori berdasarkan kolom gabungan dan membaca yang lain dan memeriksa tabel hash untuk kecocokan. Penggabungan hash adalah biaya yang sangat rendah ketika tabel hash dapat disimpan seluruhnya dalam memori, dengan total biaya yang sangat sedikit lebih dari biaya membaca set data. Biaya meningkat jika tabel hash harus ditumpahkan ke disk dalam jenis satu-pass, dan meningkat secara signifikan untuk jenis multipass.
(Di pra-10g, gabungan luar dari tabel besar ke tabel kecil bermasalah dari segi kinerja, karena pengoptimal tidak dapat menyelesaikan kebutuhan untuk mengakses tabel yang lebih kecil terlebih dahulu untuk gabungan hash, tetapi tabel yang lebih besar terlebih dahulu untuk gabungan luar. Akibatnya hash join tidak tersedia dalam situasi ini).
Biaya gabungan hash dapat dikurangi dengan mempartisi kedua tabel pada kunci gabungan. Ini memungkinkan pengoptimal untuk menyimpulkan bahwa baris dari partisi dalam satu tabel hanya akan menemukan kecocokan di partisi tertentu dari tabel lain, dan untuk tabel yang memiliki n partisi, hash join dijalankan sebagai n hash join independen. Ini memiliki efek sebagai berikut:
- Ukuran setiap tabel hash berkurang, sehingga mengurangi jumlah maksimum memori yang diperlukan dan berpotensi menghilangkan kebutuhan operasi yang memerlukan ruang disk sementara.
- Untuk operasi kueri paralel, jumlah pengiriman pesan antar-proses sangat berkurang, mengurangi penggunaan CPU dan meningkatkan kinerja, karena setiap gabungan hash dapat dilakukan oleh sepasang proses PQ.
- Untuk operasi kueri non-paralel, kebutuhan memori dikurangi dengan faktor n, dan baris pertama diproyeksikan dari kueri sebelumnya.
Perlu diperhatikan bahwa hash join hanya dapat digunakan untuk equi-join, tetapi merge join lebih fleksibel.
Secara umum, jika Anda menggabungkan sejumlah besar data dalam equi-join, maka hash join akan menjadi taruhan yang lebih baik.
Topik ini dibahas dengan sangat baik dalam dokumentasi.
http://download.Oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523
12.1 dokumen:https://docs.Oracle.com/database/121/TGSQL/tgsql_join.htm