質問

私は実行計画を学び始めており、ハッシュマッチが正確にどのように機能するか、そしてそれが単純な結合で使用される理由について混乱しています。

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

enter image description here

私が理解すると、上部インデックススキャンの結果がハッシュ可能になり、下部インデックスクラスタースキャンの各行が調べられます。ハッシュテーブルが少なくともある程度機能する方法は理解していますが、このような例でどの値が正確にハッシュされるかについて混乱しています。

私が理にかなっているのは、それらの間の共通のフィールドであるIDがハッシュされていることです。

役に立ちましたか?

解決

sqlrockstarの回答の引用として

大規模で未解決の入力に最適です。

今、

  • users.displaynameインデックススキャン(想定されていない想定)からusers.id(clustered)= unsortedを取得します
  • また、owneruserid = unsortedの投稿をスキャンしています

これは2つの順序付けられていない入力です。

タイトルを含む、owneruseridの投稿テーブルのインデックスを検討します。これにより、入力の片側に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

数値フィールドをハッシュすることの利点は、より大きな値を取って、それをより小さなピースに分解してハッシュテーブルに収まるようにすることです。

グラント・フリッチーがそれを説明する方法は次のとおりです。

「一方、ハッシュテーブルは、すべての要素を等しいサイズのカテゴリ、またはバケツに分割するデータ構造であり、要素に迅速にアクセスできます。ハッシュ関数は、要素がどのバケットに入るかを決定します。たとえば、テーブルから列を並べ、ハッシュ値にハッシュしてから、ハッシュ値をハッシュテーブルに保存できます。」

また、次の記事からリンクから彼の電子ブック「SQL Server実行計画の分析」の無料コピーを入手することもできます。

ソース: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top