【SQL Server】クエリヒント / テーブルヒント

はじめに

まずは、以下の動画をみた方がいい。
http://technet.microsoft.com/ja-jp/sql_5mins16-2.aspx

概要

■通常は...
最適と思われる実行プランを、オプティマイザが選んでデータアクセスしてくれる

【問題点】
 * オプティマイザは、必ずしも完璧じゃない
 →オプティマイザに対し、強制的に意図した実行プランを作成する必要がある。

【問題解決策】
 * 「クエリヒント」を使うといい


FORCE ORDER

 * from 句に記述したとおりに強制的に結合する
 →つまり、クエリの構文に記述したとおりの順番でテーブルを結合する

使用体験談

http://go4it.seesaa.net/article/136686716.html
http://handcraft.blogsite.org/blog/2011/06/11/263

参考文献

http://codezine.jp/article/detail/1629?p=2

EXPAND VIEWS

 * インデックス付きビューが使用されないようにする

参考文献

http://technet.microsoft.com/ja-jp/library/cc917715.aspx
http://msdn.microsoft.com/ja-jp/library/ms181151(v=sql.105).aspx

HASH JOIN

 * 強制的に、HASH結合にする
 * From SQL Server2005

結合アルゴリズムについて

http://itpro.nikkeibp.co.jp/article/COLUMN/20060111/227102/
より抜粋

一般的に言って、ネスト・ループ結合<マージ結合<ハッシュ結合の順で高速になります(ハッシュ結合が最速)。
・・・中略・・・
テーブルの内容や処理の目的などに応じて最適なアルゴリズムは変わります。
ヒントを使って結合アルゴリズムを明示的に指定するなどして、状況に応じて使い分けるようにしてください。

使用体験談

http://d.hatena.ne.jp/iad_otomamay/20080626/p1
http://d.hatena.ne.jp/iad_otomamay/20080121/p1

参考文献

http://ottan.blog71.fc2.com/blog-entry-643.html

FORCESEEK

http://msdn.microsoft.com/ja-jp/library/bb510478(v=sql.105).aspx
より

 * インデックスのシーク操作のみを使用するようにクエリ オプティマイザを設定できる
 * From SQL Server2008

サンプル

■使用例1
SELECT * FROM sampleTable WITH(FORCESEEK) WHERE id > 19000;
■使用例2
SELECT * FROM sampleTable WHERE id > 19000 OPTION(TABLE HINT(table1, FORCESEEK));
■使用例3
SELECT * FROM sampleTable(FORCESEEK) WHERE id > 19000;

使用体験談

http://handcraft.blogsite.org/blog/2011/06/11/263

参考文献

http://msdn.microsoft.com/ja-jp/library/ms187373.aspx

クエリヒントあれこれ

複数指定するには

サンプル

SELECT * FROM sampleView OPTION(FORCE ORDER, EXPAND VIEWS) WHERE id > 19000;