実行計画の基本—ハッシュマッチの混乱


39

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

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

ここに画像の説明を入力してください

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

私が理にかなっているのは、それらの間の共通フィールドであるidがハッシュされていることですが、もしそうなら、なぜ数値をハッシュするのでしょうか?

回答:


29

SQLRockstarの回答の引用として

ソートされていない大規模な入力に最適です。

さて、

  • Users.DisplayNameインデックススキャン(非クラスター化を想定)から、Users.Id(クラスター化を想定)=未ソートを取得します
  • OwnerUserId = unsortedの投稿もスキャンしています

これは2つの順不同入力です。

タイトルなど、OwnerUserIdの投稿テーブルのインデックスを検討します。これにより、JOINへの入力の片側に何らかの順序が追加され、インデックスがカバーされます

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

その後、Users.DisplayNameインデックスが使用されず、代わりにPKがスキャンされることがあります。


1
ああ、わかりました。私は、Users.DisplayNameがPKによって注文されていることを考えていましたが、そうではありません。ハッシュを使用することは、私にとってもっと意味があります。ありがとう!
カイルブラント

1
また、OPTION (FAST n)ヒントを試すこともできます。nは、予想される大まかな行数です。これにより、nが低い場合、ハッシュ結合ではなくネストされたループにオプティマイザーをバイアスします。その理由は、ハッシュ結合は大規模な結合では高速ですが、起動コストが高いためです。ネストされたループは行ごとに高価ですが、非常に安価に開始できます。したがって、実際のデータとアクセスパターンに基づいて微調整する必要があります。
ガイウス

1
@Gaius:個人的には、ヒントよりもインデックスが欲しいです。ヒントは、クエリを追加するときにのみ有効です。別名ヒントは時間の経過とともに責任を負います。インデックスは非常に長く役立つ傾向があります。
gbn

1
それはどちらかまたは命題ではありません:
ガイウス

14

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


それが単なるIDフィールドである場合、私はIDフィールドをハッシュすることの利点を理解していないと思いますか?
カイルブラント

:クレイグ・フリードマンのブログへのリンクは、より多くの利用可能な記事に参加+1があるblogs.msdn.com/b/craigfr/archive/tags/joins
ジェフ

9

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

Grant Fritcheyは次のように説明しています。

「一方で、ハッシュテーブルは、すべての要素を同じサイズのカテゴリまたはバケットに分割するデータ構造で、要素にすばやくアクセスできるようにします。ハッシュ関数は、要素がどのバケットに入るかを決定します。たとえば、 、テーブルから行を取得してハッシュ値にハッシュし、ハッシュ値をハッシュテーブルに格納できます。」

次の記事のリンクから、彼の電子書籍「Discoverting SQL Server Execution Plans」の無料コピーを入手することもできます。

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


JOINSに関する別の興味深い記事シリーズ: sql-server-performance.com/articles/dba/…– 11
ジェフ

SQL Serverの実行計画を分析していますが、すばらしい方法です。しかし、私は少しこの時点で:-Pに捕まってしまった
カイルブラント

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.