演算子のハッシュ一致内部結合を削除することによるクエリパフォーマンスの向上


9

以下のこの質問の内容を自分の状況に適用しようとしていますが、可能であれば、演算子Hash Match(Inner Join)をどのようにして取り除くことができるのか、少し混乱しています。

SQL Serverクエリのパフォーマンス-ハッシュマッチ(内部結合)の必要性の排除

私は10%の費用に気づき、それを減らすことができるかどうか疑問に思っていました。以下のクエリプランを参照してください。

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

この作業は、今日調整しなければならなかったクエリサッドから来ています。

SELECT c.AccountCode, MIN(d.CustomerSID) 
FROM   Stage.Customer c 
INNER JOIN Dimensions.Customer d  ON c.Email = d.Email
                                  OR (
                                          c.HomePostCode = d.HomePostCode
                                       AND c.StrSurname = d.strSurname
                                                                    )
GROUP BY c.AccountCode

これらのインデックスを追加した後:

---------------------------------------------------------------------
-- Create the indexes
---------------------------------------------------------------------

CREATE NONCLUSTERED INDEX IDX_Stage_Customer_HOME_SURNAME_INCL
ON Stage.Customer(HomePostCode ,strSurname)
INCLUDE (AccountCode)
--WHERE HASEMAIL = 0
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go


CREATE NONCLUSTERED INDEX IDX_Dimensions_Customer_HOME_SURNAME_INCL
ON Dimensions.Customer(HomePostCode ,strSurname)
INCLUDE (AccountCode,CustomerSID)
--WHERE HASEMAIL = 0
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go



CREATE NONCLUSTERED INDEX IDX_Stage_Customer_EMAIL_INCL
ON Stage.Customer(EMAIL)
INCLUDE (AccountCode)
--WHERE HASEMAIL = 1
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go


CREATE NONCLUSTERED INDEX IDX_Dimensions_Customer_EMAIL_INCL
ON Dimensions.Customer(EMAIL)
INCLUDE (AccountCode,CustomerSID)
--WHERE HASEMAIL = 1
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go

これは新しいクエリです:

----------------------------------------------------------------------------
-- new query 
----------------------------------------------------------------------------

SELECT * 
FROM (    
SELECT AccountCode
     ,RO=ROW_NUMBER () OVER (PARTITION BY AccountCode ORDER BY CustomerSID)
     --,CustomerSID=MIN(CustomerSID) OVER (PARTITION BY AccountCode ORDER BY AccountCode)
       ,CustomerSID
FROM (    
          SELECT c.AccountCode, D.CustomerSID
       FROM   Stage.Customer c 
       INNER JOIN Dimensions.Customer d  ON c.Email = d.Email

          UNION ALL

          SELECT c.AccountCode, D.CustomerSID
       FROM   Stage.Customer c 
       INNER JOIN Dimensions.Customer d  ON c.HomePostCode = d.HomePostCode
                                        AND c.StrSurname = d.strSurname
) RADHE
) R1
WHERE RO = 1

これにより、クエリの実行時間が8分から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

この実行計画を説明できますか?ハッシュの一致に固有ではなく、関連性がある実行プランに関する優れた洞察を提供します。

定数スキャンは、SQL Serverがバケットを作成する方法であり、実行プランの後半にバケットを配置します。私はそれのより完全な説明をここに投稿しまし。常時スキャンの目的を理解するには、計画をさらに詳しく調べる必要があります。この場合、定数スキャンによって作成されたスペースを埋めるために使用されているのは、Compute Scalarオペレーターです。

Compute Scalarオペレーターには、NULLと値1045876が読み込まれているため、データをフィルター処理する目的でループ結合で使用されることは明らかです。

本当にクールな部分は、この計画が簡単なことです。それは最小限の最適化プロセスを経たことを意味します。すべての操作は、マージ間隔につながります。これは、インデックスシークの最小比較演算子セットを作成するために使用されます(詳細はこちら)。

この質問で は、SSMSを使用して、実行計画ペインに実際のクエリコストを表示できますか? SQL Serverのマルチステートメントストアドプロシージャのパフォーマンスの問題を修正しています。時間をかけるべき部分を知りたい。

クエリコストの読み取り方法から理解しましたが、それは常にパーセントですか?実際の実行計画を含めるようにSSMSに指示された場合でも、「クエリコスト(バッチに対する)」の数値はコストの見積もりに基づいており、実際とはかけ離れている場合があります。

クエリのパフォーマンスの測定:「実行プランのクエリコスト」と「所要時間」 は、2つの異なるクエリのパフォーマンスを比較する必要がある場合に役立ちます。

ではSQL Serverの実行計画を読み込みますが実行計画を読み取るための大きなヒントを見つけることができます。

この主題に関連しているので私が本当に気に入った他の質問/回答、および私の個人的な参照のために引用したいと思います:

実行プランを使用してT-SQLクエリを最適化する方法

SQLはこの手順の適切な計画を生成できますか?

同じSQLステートメントで実行プランが異なる

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