過去に MERGE JOIN の説明など、結合方式について説明しています。ryuchan.hatenablog.com
MERGE JOIN は高速!っと思ったら、大間違いです。きちんと実行プランの細部までチェックしましょう。サンプルの実行プランは下記の通りです。MERGE JOIN のオペレータのその先に、SORT オペレータがあります。その一つに警告が出ています。
あら、tempdb への書き込みが発生しています。さらに結構大量なレコードが!!
なぜ、こんなことが発生するんでしょうか?犯人は下図の通りです。MERGE JOIN のオペレータを参照してみましょう。多対多( MANY-TO-MANY )が原因です。一対多 ( ONE-TO-MANY ) であれば問題ありません。
MANY-TO-MANY の場合、結合したテーブルを一時的に TempDB に格納します。これがレスポンス悪化の原因です。MANY-TO-MANY の詳細は、Craig Freedman のブログを参照しましょう。(はい、他力)
これを解消するには、いくつかのパターンはありますが、私は安易に INNER JOIN を INNER LOOP JOIN で Nested Loop に強制することにより解決しています。(一例ではありますが....)あくまでも、一例なのでご参考程度に....
※やっぱり、これおすすめ。
Microsoft SQL Server 2012 Internals (Developer Reference)
- 作者: Kalen Delaney,Craig Freeman
- 出版社/メーカー: Microsoft Press
- 発売日: 2013/11/15
- メディア: Kindle版
- この商品を含むブログを見る