Saya mulai mempelajari rencana eksekusi dan bingung tentang bagaimana sebenarnya hash cocok bekerja dan mengapa itu akan digunakan dalam gabung sederhana:
select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)
Seperti yang saya pahami, hasil pemindaian indeks atas menjadi hash dan setiap baris dalam pemindaian berkerumun indeks bawah terlihat. Saya mengerti bagaimana tabel hash bekerja setidaknya sampai tingkat tertentu, tapi saya bingung tentang nilai mana yang benar-benar di-hash dalam contoh seperti ini.
Apa yang masuk akal bagi saya adalah bidang yang sama di antara mereka, id, adalah hash - tetapi jika ini masalahnya, mengapa hash angka?
sumber
OPTION (FAST n)
petunjuknya, di mana n adalah jumlah baris kasar yang Anda harapkan. Apa yang akan dilakukan adalah bias optimizer ke loop bersarang daripada hash bergabung ketika n rendah. Alasannya adalah bahwa hash bergabung cepat untuk bergabung besar tetapi memiliki biaya awal yang tinggi. Loop bersarang mahal per-baris, tetapi bisa memulai dengan sangat murah. Jadi ini masalah fine tuning berdasarkan data aktual Anda dan pola akses.Dari http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/
"Gabung hash adalah salah satu operasi gabung yang lebih mahal, karena membutuhkan pembuatan tabel hash untuk melakukan gabung. Yang mengatakan, gabung yang terbaik untuk input besar, tidak disortir. Ini adalah yang paling banyak menggunakan memori dari semua dari gabungan
Bergabung dengan hash pertama membaca salah satu input dan hash kolom bergabung dan menempatkan nilai hash dan kolom yang dihasilkan ke dalam tabel hash dibangun di memori. Kemudian ia membaca semua baris di input kedua, hash itu dan memeriksa baris di ember hash yang dihasilkan untuk baris bergabung. "
yang menaut ke pos ini:
http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx
HTH
sumber
Keuntungan dari hashing bidang numerik adalah Anda mengambil nilai yang lebih besar dan memecahnya menjadi potongan-potongan kecil sehingga bisa masuk ke tabel hash.
Begini cara Grant Fritchey menjelaskannya:
"Tabel hash, di sisi lain, adalah struktur data yang membagi semua elemen ke dalam kategori berukuran sama, atau bucket, untuk memungkinkan akses cepat ke elemen. Fungsi hash menentukan ember mana yang dimasukkan ke elemen. Misalnya, , Anda dapat mengambil baris dari sebuah tabel, hash menjadi nilai hash, lalu simpan nilai hash ke dalam tabel hash. "
Anda juga bisa mendapatkan salinan gratis ebooknya "Dissecting SQL Server Execution Plans" dari tautan dari artikel berikut:
Sumber: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/
sumber