私は実行計画を学び始めており、ハッシュ一致がどのように正確に機能するか、そして単純な結合でそれが使用される理由について混乱しています:
select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)
私が理解しているように、トップインデックススキャンの結果はハッシュ可能になり、ボトムインデックスのクラスタースキャンの各行が検索されます。私はハッシュテーブルが少なくともある程度はどのように機能するかを理解していますが、このような例では、どの値が正確にハッシュされるかについて混乱しています。
それらの間の共通のフィールドであるidがハッシュ化されているのは、私には何が意味があるでしょうか?
SQLRockstarの回答の引用
ソートされていない大きな入力に最適です。
さて、
これは2つの順序付けられていない入力です。
Titleを含むOwnerUserIdのPostsテーブルのインデックスを検討します。これにより、JOINへの入力の片側に順序が追加されます+インデックスをカバーします
CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)
その後、Users.DisplayNameインデックスが使用されず、代わりにPKがスキャンされることがわかります。
http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/ から
「ハッシュ結合は、結合を行うためにハッシュテーブルを作成する必要があるため、よりコストのかかる結合演算の1つです。それは、大規模なソートされていない入力に最適な結合です。結合の
ハッシュ結合は、最初に入力の1つを読み取り、結合列をハッシュし、結果のハッシュと列の値をメモリに構築されたハッシュテーブルに入れます。次に、2番目の入力のすべての行を読み取り、それらをハッシュし、結果のハッシュバケット内の行をチェックして、結合する行を探します。
この投稿へのリンク:
http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx
HTH
数値フィールドをハッシュすることの利点は、大きな値を取り、それを小さな断片に分割して、ハッシュテーブルに収まるようにすることです。
Grant Fritcheyによる説明は次のとおりです。
「一方、ハッシュテーブルは、すべての要素を同じサイズのカテゴリまたはバケットに分割して、要素にすばやくアクセスできるようにするデータ構造です。ハッシュ関数は、要素が入るバケットを決定します。たとえば、テーブルから行を取得し、それをハッシュ値にハッシュしてから、ハッシュ値をハッシュテーブルに保存できます。」
次の記事のリンクから、彼の電子ブック「Dissecting SQL Server Execution Plans」の無料コピーを入手することもできます。
ソース: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/