it-swarm.asia

Dasar-dasar Rencana Eksekusi - Kebingungan Pertandingan Hash

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)

enter image description here

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 taraf tertentu, tapi saya bingung tentang nilai mana yang sebenarnya 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?

41
Kyle Brandt

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.

31
gbn

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 intensif 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

14
SQLRockstar

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 bucket 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 ebook-nya "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/

9
Jeff