Dasar-dasar Rencana Eksekusi - Kebingungan Pertandingan Hash

39

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)

masukkan deskripsi gambar di sini

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?

Kyle Brandt
sumber

Jawaban:

29

Seperti kutipan kutipan SQLRockstar

terbaik untuk input besar dan tidak disortir.

Sekarang,

  • dari pemindaian indeks Users.DisplayName (diasumsikan nonclustered) Anda mendapatkan Users.Id (dengan asumsi berkerumun) = tidak disortir
  • Anda juga memindai Posting untuk OwnerUserId = tidak disortir

Ini adalah 2 input tidak berurutan.

Saya akan mempertimbangkan indeks pada tabel Posting di OwnerUserId, termasuk Judul. Ini akan menambahkan beberapa pesanan di satu sisi input ke GABUNG + itu akan mencakup indeks

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

Anda kemudian dapat menemukan bahwa indeks Users.DisplayName tidak akan digunakan dan itu akan memindai PK sebagai gantinya.

gbn
sumber
1
Ah oke saya mengerti sekarang, saya berpikir tentang Users. Displayplay Nama telah dipesan oleh PK yang tidak terjadi. Sekarang penggunaan Hash jauh lebih masuk akal bagi saya. Terima kasih!
Kyle Brandt
1
Anda juga bisa mencoba 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.
Gayus
1
@ Gayus: Secara pribadi saya lebih suka memiliki indeks daripada petunjuk. Petunjuk hanya baik untuk kueri saat Anda menambahkannya. Aka petunjuk itu menjadi tanggung jawab dari waktu ke waktu. Indeks cenderung jauh lebih berguna.
gbn
1
ini bukan proposisi salah satu atau :-)
Gaius
14

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

SQLRockstar
sumber
Jadi jika itu hanya bidang id, saya kira saya tidak mengerti keuntungan dari hashing bidang id?
Kyle Brandt
+1 untuk tautan ke blog Craig Freedman, ada lebih banyak artikel gabung yang tersedia: blogs.msdn.com/b/craigfr/archive/tags/joins
Jeff
9

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/

Jeff
sumber
Seri artikel menarik lainnya tentang GABUNG
Jeff
Saya bekerja dengan cara saya meskipun Membedah Rencana Eksekusi SQL Server - ini hebat! Tapi saya agak macet dalam hal ini:
Kyle Brandt