OSDN Git Service

ECPGの動的SQLの記述をSQLDAを使う場合と区別できる記述にした。
[pghintplan/pg_hint_plan.git] / doc / pg_hint_plan-ja.html
index 30a885e..e84d0af 100644 (file)
@@ -10,7 +10,7 @@
 </head>
 
 <body>
-<h1 id="pg_hint_plan">pg_hint_plan 0.1.0</h1>
+<h1 id="pg_hint_plan">pg_hint_plan 1.0.0</h1>
 <div class="navigation">
   <a href="pg_hint_plan-ja.html">pg_hint_plan</a>
 </div>
@@ -36,7 +36,6 @@
 </ol>
 </li>
 <li><a href="#restrictions">使用上の注意と制約</a></li>
-<li><a href="#known-issues">既知の問題</a></li>
 <li><a href="#seealso">関連項目</a></li>
 <li><a href="hint_list-ja.html">Appendix A. ヒント一覧</a></li>
 </div>
 <h3 id="requirement">動作環境</h3>
 <dl>
 <dt>PostgreSQL</dt>
-  <dd>バージョン 9.1.3</dd>
-  <dd>バージョン 9.2devel 4月2日版</dd>
-<dt>動作検証済みOS</dt><dd>RHEL 6.1</dd>
+  <dd>バージョン 9.1.4、9.2.1</dd>
+<dt>動作検証済みOS</dt>
+  <dd>RHEL 6.1</dd>
 </dl>
 
 <h3 id="build">ビルド</h3>
-<p>pg_hint_planをソースコードからビルドする場合、pg_hint_planのソースを展開したディレクトリでmake → make installの順に実行してください。なお、pg_hint_planのビルドにはpgxsを使用するので、RPM版のPostgreSQLを使用している環境では、postgresql-devel パッケージが必要です。</p>
+<p>pg_hint_planをソースコードからビルドする場合、pg_hint_planのソースを展開したディレクトリでmake → make installの順に実行してください。make installはPostgreSQLをインストールしたOSユーザで実行してください。なお、pg_hint_planのビルドにはpgxsを使用するので、RPM版のPostgreSQLを使用している環境では、postgresql-devel パッケージが必要です。</p>
 <p>以下にビルドの例を示します。</p>
 <pre>
-$ tar xzvf pg_hint_plan-0.1.0.tar.gz
-$ cd pg_hint_plan-0.1.0
+$ tar xzvf pg_hint_plan-1.0.0.tar.gz
+$ cd pg_hint_plan-1.0.0
 $ make
-$ make install
+$ su
+# make install
 </pre>
 
 <h2 id="uninstall">アンインストール</h2>
-<p>pg_hint_planをアンインストールするには、pg_hint_planのソースを展開したディレクトリでmake uninstallを実行してください。</p>
+<p>pg_hint_planをアンインストールするには、pg_hint_planのソースを展開したディレクトリでmake uninstallを実行してください。make uninstallはPostgreSQLをインストールしたOSユーザで実行してください。</p>
 <p>以下にアンインストールの例を示します。</p>
 <pre>
-$ cd pg_hint_plan-0.1.0
-$ make uninstall
+$ cd pg_hint_plan-1.0.0
+$ su
+# make uninstall
 </pre>
 
 <h2 id="usage">使い方</h2>
@@ -87,11 +88,11 @@ LOAD
 postgres=# </pre>
 
 <h3 id="hint-rule">ヒントの記述方法</h3>
-<p>ヒントはクエリの前のブロックコメント内に、スペース、タブ、または改行のいずれかで区切って記述してください。ヒントの対象は、カッコ内にオブジェクト名または別名(エイリアス)で指定してください。</p>
+<p>ヒントはクエリ文字列の先頭のブロックコメント内に記述してください。ブロックコメントをヒントとして認識させるには、ブロックコメントの開始直後にプラス(+)を指定する必要があります。ヒントの対象は、カッコ内にオブジェクト名または別名(別名)で指定してください。オブジェクト名は、スペース、タブ、または改行のいずれかで区切って指定してください。</p>
 
 <p>以下の例では、HashJoinとSeqScanヒントにより、pgbench_accountsテーブルに対するSeq Scanの結果をHash Joinする実行計画が選択されています。</p>
 <pre>
-postgres=# /*
+postgres=# /*+
 postgres*#    <span class="strong">HashJoin(a b)</span>
 postgres*#    <span class="strong">SeqScan(a)</span>
 postgres*#  */
@@ -113,31 +114,35 @@ postgres-#   ORDER BY a.aid;
 postgres=# </pre>
 
 <h3 id="hint-group">ヒントのグループ</h3>
-<p>pg_hint_planã\81§ä½¿ã\81\88ã\82\8bã\83\92ã\83³ã\83\88ã\81¯ã\80\81ã\82¹ã\82­ã\83£ã\83³æ\96¹å¼\8fã\81¨çµ\90å\90\88æ\96¹å¼\8fã\80\81çµ\90å\90\88é \86åº\8fã\80\81GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®4ã\82°ã\83«ã\83¼ã\83\97ã\81«å\88\86ã\81\91ã\82\89ã\82\8cã\81¾ã\81\99ã\80\82å\90\8cã\81\98ã\82°ã\83«ã\83¼ã\83\97ã\81®ã\83\92ã\83³ã\83\88ã\82\92å\90\8cã\81\98ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81«å¯¾ã\81\97ã\81¦æ\8c\87å®\9aã\81\97ã\81\9få ´å\90\88ã\81¯ã\80\81æ\9c\80å¾\8cã\81«æ\8c\87å®\9aã\81\97ã\81\9fã\83\92ã\83³ã\83\88ã\81\8cé\81©ç\94¨ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82å\90\84ã\82°ã\83«ã\83¼ã\83\97ã\81®å\85·ä½\93ç\9a\84ã\81ªã\83\92ã\83³ã\83\88ã\81¯ã\80\81<a href="hint_list-ja.html">ã\83\92ã\83³ã\83\88ä¸\80覧</a>ã\82\92å\8f\82ç\85§ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82</p>
+<p>pg_hint_planで使えるヒントは、スキャン方式と結合方式、結合順序、GUCパラメータの4グループに分けられます。各グループの具体的なヒントは、<a href="hint_list-ja.html">ヒント一覧</a>を参照してください。</p>
 
 <h4>スキャン方式</h4>
-<p>あるテーブルのスキャン方式を選択するかを指定できるヒントのグループで、「SeqScan」や「IndexScan」などが含まれます</p>
-<p>特定のテーブルについてあるスキャン方式を選択して欲しい場合は、そのスキャン方式のヒントと、対象となるオブジェクトの名前を指定してください。逆に、特定のテーブルについてあるスキャン方式を選択して欲しくない場合は、Noで始まるヒントを指定してください。</p>
+<p>あるオブジェクトでどのスキャン方式を選択するかを指定できるヒントのグループで、「SeqScan」や「IndexScan」などが含まれます。</p>
+<p>スキャン方式を指定できるオブジェクトは、通常のテーブル、継承テーブル、UNLOGGEDテーブル、一時テーブル、システムカタログです。スキャン方式を指定できないオブジェクトは、外部テーブル、テーブル関数、VALUESコマンド結果、CTE、ビュー、副問い合わせ結果です。</p>
+<p>特定のオブジェクトについてあるスキャン方式を選択して欲しい場合は、そのスキャン方式のヒントと、対象となるオブジェクトの名前を指定してください。逆に、特定のオブジェクトについてあるスキャン方式を選択して欲しくない場合は、Noで始まるヒントを指定してください。同じオブジェクトに対して複数のスキャン方式のヒントを指定した場合は、最後に指定したヒントが適用されます。</p>
 
 <h4>結合方式</h4>
-<p>あるテーブル結合の組み合わせでどの結合方式を選択するかを指定できるヒントのグループで、「MergeJoin」や「NestedLoop」などが含まれます。</p>
-<p>特定のテーブルの組み合わせについてある結合方式を選択して欲しい場合は、その結合方式のヒントと、対象となる2つ以上のテーブルの名前を指定してください。逆に、特定の結合方式を選択して欲しくない場合は、Noで始まるヒントを指定してください。</p>
+<p>あるオブジェクトの組み合わせでどの結合方式を選択するかを指定できるヒントのグループで、「MergeJoin」や「NestLoop」などが含まれます。</p>
+<p>結合方式を指定できるオブジェクトは、通常のテーブル、継承テーブル、UNLOGGEDテーブル、一時テーブル、外部テーブル、システムカタログ、テーブル関数、VALUESコマンド結果、CTEです。結合方式を指定できないオブジェクトは、ビュー、副問い合わせ結果です。</p>
+<p>特定のオブジェクトの組み合わせについてある結合方式を選択して欲しい場合は、その結合方式のヒントと、対象となる2つ以上のオブジェクトの名前を指定してください。逆に、特定のオブジェクトの組み合わせについてある結合方式を選択して欲しくない場合は、Noで始まるヒントを指定してください。同じオブジェクトの組み合わせに対して複数の結合方式のヒントを指定した場合は、最後に指定したヒントが適用されます。</p>
 <h4>結合順序</h4>
-<p>特定のテーブル結合の組み合わせでどのような順番で結合するか指定できるヒントのグループで、現在は「Leading」のみです。</p>
-<p>先に結合して欲しいテーブルから順にテーブル名またはテーブル別名を指定してください。</p>
+<p>あるオブジェクトの組み合わせでどのような順番で結合するかを指定できるヒントのグループで、「Leading」のみが含まれます。</p>
+<p>結合順序を指定できるオブジェクトは結合方式と同じです。</p>
+<p>先に結合して欲しいオブジェクトから順にオブジェクト名または別名を指定してください。複数の結合順序のヒントを指定した場合は、最後に指定したヒントが適用されます。クエリ中に複数の問い合わせブロックがあり、それぞれに結合順を指定したい場合は、それぞれの結合順を1つのLeadingヒントに連続して指定してください。</p>
 <h4>GUCパラメータ</h4>
-<p>そのクエリの実行計画を作成している間だけGUCパラメータを変更できるヒントのグループで、現在は「Set」のみです。</p>
-設定したいGUCパラメータとそのパラメータの値を指定してください。ただし、指定する値に小文字とアンダースコア(_)以外の文字(大文字、数字、スペースなど)を含む場合はダブルクォート(")で囲んでください。</p>
+<p>そのクエリの実行計画を作成している間だけGUCパラメータを変更できるヒントのグループで、「Set」のみが含まれます。</p>
+<p>設定したいGUCパラメータとそのパラメータの値を指定してください。<a href="http://www.postgresql.org/docs/9.1/static/sql-set.html">SET</a>コマンドで指定できるGUCパラメータならば全て指定できますが、効果があるのは<a href="http://www.postgresql.org/docs/9.1/static/runtime-config-query.html">問い合わせ計画</a>のGUCパラメータのみです。同じGUCパラメータに対して複数のGUCパラメータのヒントを指定した場合は、最後に指定したヒントが適用されます。</p>
+<p>Setヒントに<a href="#hint-GUC">pg_hint_planのGUCパラメータ</a>を指定することはできますが、期待通りの動作をしないため、指定しないことをおすすめします。指定した場合の実際の動作は、<a href="#restrictions">使用上の注意と制約</a>を参照してください。</p>
 
 <h3 id="hint-GUC">pg_hint_planのGUCパラメータ</h3>
-<p>pg_hint_planã\83\84ã\83¼ã\83«ã\81«é\96¢するGUCパラメータを以下に記述します。</p>
+<p>pg_hint_planã\81®å\8b\95ä½\9cã\82\92å\88¶å¾¡するGUCパラメータを以下に記述します。</p>
 <table>
 <thead>
 <tr>
 <tr><th>GUCパラメータ</th><th>説明</th><th>デフォルト値</th></tr>
 </tr></thead>
 <tbody>
-<tr><td>pg_hint_plan.enable</td>
+<tr><td>pg_hint_plan.enable_hint</td>
   <td>pg_hint_planの機能を有効または無効にします。</td><td>on</td></tr>
 <tr><td>pg_hint_plan.debug_print</td>
   <td>pg_hint_planのデバッグ出力を有効にします。メッセージはLOGメッセージレベルで出力されますので、デフォルトではサーバログに出力され、クライアントには渡されません。</td><td>off</td></tr>
@@ -145,19 +150,34 @@ postgres=# </pre>
   <td>指定したヒントを解釈できなかった場合に、どのメッセージ階層でログを出力するかを指定します。有効な値は、debug5、debug4、debug3、debug2、debug1、log、info、notice、warning、またはerrorです。fatalとpanicは指定できません。</td><td>info</td></tr>
 </tbody>
 </table>
+<p>
+PostgreSQL 9.1の環境でこれらのパラメータをpostgresql.confファイルで設定するには、<a href="http://www.postgresql.org/docs/9.1/static/runtime-config-custom.html#GUC-CUSTOM-VARIABLE-CLASSES">custom_variable_classes</a>にpg_hint_planを加える必要があります。
+典型的な使用例は以下のようになります。
+</p>
+<pre>
+# postgresql.conf
+shared_preload_libraries = 'pg_hint_plan'
+
+custom_variable_classes = 'pg_hint_plan'    # 9.2以降は廃止されたため記述不要
+pg_hint_plan.parse_messages = 'debug2'
+</pre>
+<p>
+PostgreSQL 9.2以降ではcustom_variable_classesは廃止されているため、pg_hint_planのGUCパラメータを標準のGUCパラメータと同様に記述することができます。
+</p>
 
 <h2 id="restrictions">使用上の注意と制約</h2>
 <p>pg_hint_planを使用する際には、以下の注意と制約があります。</p>
+<h3>ヒントの指定方法</h3>
 <dl>
 <dt>ヒントの記述位置</dt>
 <dd>クエリの前に複数のブロックコメントを記述する場合は、最初のブロックコメントにのみヒントを記述してください。二番目以降のブロックコメントは、ヒントと見なされず無視されます。以下の例では、HashJoin(a b)とSeqScan(a)がヒントと見なされ、IndexScan(a)とMergeJoin(a b)は無視されています。</p>
 <pre>
-postgres=# /*
+postgres=# /*+
 postgres*#    <span class="strong">HashJoin(a b)</span>
 postgres*#    <span class="strong">SeqScan(a)</span>
 postgres*#  */
-postgres-# /* IndexScan(a) */
-postgres-# EXPLAIN SELECT /* MergeJoin(a b) */ *
+postgres-# /*+ IndexScan(a) */
+postgres-# EXPLAIN SELECT /*+ MergeJoin(a b) */ *
 postgres-#    FROM pgbench_branches b
 postgres-#    JOIN pgbench_accounts a ON b.bid = a.bid
 postgres-#   ORDER BY a.aid;
@@ -174,60 +194,166 @@ postgres-#   ORDER BY a.aid;
 
 postgres=# </pre>
 </dd>
-<dt>オブジェクト名の引用</dt>
-<dd><p>ヒント対象のオブジェクト名に小文字とアンダースコア(_)以外の文字(大文字、数字、スペースなど)を含む場合は、ダブルクォート(")で囲んでください。</p>
-</dd>
+<dt>オブジェクト名の引用符付け</dt>
+<dd>ヒントに記述するオブジェクト名や別名が閉じ括弧())、二重引用符(")、空白(スペース、タブ、改行のいずれか)を含む場合は、通常のSQL文で使う場合と同じように二重引用符(")で囲んでください。二重引用符を含むオブジェクト名は、二重引用符で括ったうえで二重引用符を二重引用符でエスケープしてください(例: 「quoted"table"name」→「"quoted""table""name"」)。</dd>
 <dt>同一名称テーブルの区別</dt>
-<dd>スキーマ違いや同一テーブルの複数回使用などでクエリ中に同一名称のテーブルが複数回出現する場合は、テーブルに別名をつけてそれぞれのテーブルを区別してください。以下の例の1つ目のSQL文では、MergeJoin(t1 t1)をヒントに指定したとき、ヒント対象のオブジェクトが特定できずにエラーになっています。2つ目のSQL文では、各テーブルにptやstという別名をつけているため、実行計画作成時にヒントで指定した通りにMerge Joinを選択しています。
-</p>
+<dd>スキーマ違いや同一テーブルの複数回使用などでクエリ中に同一名称のテーブルが複数回出現する場合は、テーブルに別名をつけてそれぞれのテーブルを区別してください。以下の例の1つ目のSQL文では、HashJoin(t1 t1)をヒントに指定したとき、ヒント対象のオブジェクトが特定できずにエラーになっています。2つ目のSQL文では、各テーブルにptやstという別名をつけているため、実行計画作成時にヒントで指定した通りにHash Joinを選択しています。</p>
 <pre>
-postgres=# /* <span class="strong">MergeJoin(t1 t1)</span>*/
+postgres=# /*+ <span class="strong">HashJoin(t1 t1)</span>*/
 postgres-# EXPLAIN SELECT * FROM s1.t1
 postgres-# JOIN public.t1 ON (s1.t1.id=public.t1.id);
-INFO:  hint syntax error at or near "t1 t1)"
-<span class="strong">DETAIL:  relation name "t1" is ambiguous</span>
-INFO:  hint syntax error at or near "t1 t1)"
-<span class="strong">DETAIL:  relation name "t1" is ambiguous</span>
-                             QUERY PLAN
---------------------------------------------------------------------
- Hash Join  (cost=270.00..323.05 rows=1230 width=44)
-   Hash Cond: (s1.t1.id = public.t1.id)
-   ->  Seq Scan on t1  (cost=0.00..22.30 rows=1230 width=36)
-   ->  Hash  (cost=145.00..145.00 rows=10000 width=8)
-         ->  Seq Scan on t1  (cost=0.00..145.00 rows=10000 width=8)
-(5 rows)
+INFO:  hint syntax error at or near "HashJoin(t1 t1)"
+<span class="strong">DETAIL:  Relation name "t1" is ambiguous.</span>
+                            QUERY PLAN
+------------------------------------------------------------------
+ Merge Join  (cost=337.49..781.49 rows=28800 width=8)
+   Merge Cond: (s1.t1.id = public.t1.id)
+   ->  Sort  (cost=168.75..174.75 rows=2400 width=4)
+         Sort Key: s1.t1.id
+         ->  Seq Scan on t1  (cost=0.00..34.00 rows=2400 width=4)
+   ->  Sort  (cost=168.75..174.75 rows=2400 width=4)
+         Sort Key: public.t1.id
+         ->  Seq Scan on t1  (cost=0.00..34.00 rows=2400 width=4)
+(8 行)
 
-postgres=# /* <span class="strong">MergeJoin(pt st)</span> */
+postgres=# /*+ <span class="strong">HashJoin(pt st)</span> */
 postgres-# EXPLAIN SELECT * FROM s1.t1 st
 postgres-# JOIN public.t1 pt ON (st.id=pt.id);
-                                    QUERY PLAN
-----------------------------------------------------------------------------------
- <span class="strong">Merge Join</span>  (cost=0.00..421.33 rows=1230 width=44)
-   Merge Cond: (st.id = pt.id)
-   ->  Index Scan using t1_id_idx on t1 st  (cost=0.00..62.70 rows=1230 width=36)
-   ->  Index Scan using t1_pkey on t1 pt  (cost=0.00..318.25 rows=10000 width=8)(4 rows)
+                             QUERY PLAN
+---------------------------------------------------------------------
+ <span class="strong">Hash Join</span>  (cost=64.00..1112.00 rows=28800 width=8)
+   Hash Cond: (st.id = pt.id)
+   ->  Seq Scan on t1 st  (cost=0.00..34.00 rows=2400 width=4)
+   ->  Hash  (cost=34.00..34.00 rows=2400 width=4)
+         ->  Seq Scan on t1 pt  (cost=0.00..34.00 rows=2400 width=4)
+(5 行)
 
 postgres=#</pre>
 </p>
 </dd>
-<dt>ヒントの記述誤り</dt>
-<dd>pg_hint_planでは、ヒントの記述に誤りがあった場合は、誤った記述に関する情報を出力しますがエラー終了しません。誤った記述より前のヒントのみ有効となり、誤った記述以降のヒントを無視してクエリを実行します。</dd>
-<dt>指定するヒントの種類の重複</dt>
-<dd>同じオブジェクトに対して同じグループのヒントを重複して指定した場合は、最後に指定したヒントを使用します。</dd>
-<dt>ビューに対する制限</dt>
-<dd>ビューを複数用いるときに、各ビュー内のテーブルの別名が重複した場合は、ヒントの対象を区別できません。区別する場合は、各ビュー内のテーブルの別名を重複させないでください。</dd>
+<dt>FROM句にVALUESコマンドを指定した場合の制限</dt>
+<dd>FROM句にVALUESコマンドを指定した場合は、ヒントのオブジェクト名に「*VALUES*」を指定してください。これは、VALUESの結果に別名を指定しても、PostgreSQL本体側で「*VALUES*」に名称が置き換えられるためです。このため、複数のVALUESを使用する場合は、ヒントの対象を特定できないため、実行計画を制御できません。</dd>
 </dl>
-
-<h2 id="known-issues">既知の問題</h2>
-<p>pg_hint_planに関する既知の問題について説明します。</p>
+<h3>ヒントの適用対象の指定</h3>
 <dl>
-<dt>副問い合わせを含むSELECT文</dt>
-<dd id="view_limit">pg_hint_planの使用中に副問い合わせを含むSELECT文を実行すると、サーバ側で異常終了する場合があります。よって、pg_hint_planを試用しているときは、副問い合わせを含むSELECT文を実行しないでください。</dd>
+<dt>クエリに明記されていないテーブルへのヒント適用</dt>
+<dd>ヒントで指定した名称と一致すれば、ビュー定義や関数内クエリなどに出現するテーブルについても、ヒントを指定したクエリ内と同じようにヒントが適用されます。このため、ヒントの適用有無や適用するヒントをそれぞれのテーブルで変えたい場合は、別の別名を指定してください。</br>
+以下の例では、ビュー定義で使われている「t1」という別名をSeqScanヒントで指定したことで、表スキャンとビュー経由のスキャンの両方でSeq Scanが選択されています。ビュー定義で使用されている「t1」とは別の別名を実表に指定することで、個別にスキャン方式を制御できます。
+<pre>
+postgres=# CREATE VIEW view1 AS SELECT * FROM table1 <span class="strong">t1</span>;
+CREATE TABLE
+postgres=# /*+ SeqScan(<span class="strong">t1</span>) */
+postgres=# EXPLAIN SELECT * FROM table1 <span class="strong">t1</span> JOIN view1 t2 ON (t1.key = t2.key) WHERE t2.key = 1;
+                           QUERY PLAN
+-----------------------------------------------------------------
+ Nested Loop  (cost=0.00..358.01 rows=1 width=16)
+   ->  Seq Scan on table1 <span class="strong">t1</span>  (cost=0.00..179.00 rows=1 width=8)
+         Filter: (key = 1)
+   ->  Seq Scan on table1 <span class="strong">t1</span>  (cost=0.00..179.00 rows=1 width=8)
+         Filter: (key = 1)
+(5 rows)
+
+postgres=# /*+ SeqScan(<span class="strong">t3</span>) */
+postgres=# EXPLAIN SELECT * FROM table1 <span class="strong">t3</span> JOIN view1 t2 ON (t1.key = t2.key) WHERE t2.key = 1;
+                                   QUERY PLAN
+--------------------------------------------------------------------------------
+ Nested Loop  (cost=0.00..187.29 rows=1 width=16)
+   ->  Seq Scan on table1 <span class="strong">t3</span>  (cost=0.00..179.00 rows=1 width=8)
+         Filter: (key = 1)
+   ->  Index Scan using foo_pkey on table1 t1  (cost=0.00..8.28 rows=1 width=8)
+         Index Cond: (key = 1)
+(5 rows)
+
+</pre>
+</dd>
+<dt>継承テーブルに対するヒント</dt>
+<dd>継承テーブルにスキャン方式のヒントを指定する場合は、オブジェクト名として親テーブルの名称または別名を指定してください。全ての子テーブルに同じスキャン方式を選択します。子テーブルごとに別のスキャン方式を指定することはできません。</dd>
+<dt>ビューやルールを使うクエリのヒント</dt>
+<dd>ルールを定義したテーブルやビューを複数用いるときに、各ビュー内のテーブルの別名やルール書き換え後のクエリのテーブルの別名が重複した場合は、ヒントの対象を区別できません。区別する場合は、各ビュー内のテーブルの別名やルール書き換え後のクエリのテーブルの別名を重複させないでください。</dd>
+<dt>ルールを使うクエリでのヒントの適用範囲</dt>
+<dd>ルールによるクエリ書き換え後によってクエリが複数になる場合は、先頭のブロックコメントで指定したヒントを全てのクエリで使用します。</dd>
+<dt>マルチステートメントでのヒントの適用範囲</dt>
+<dd>クエリがマルチステートメントで実行される場合は、先頭のブロックコメントで指定したヒントを全てのクエリで使用します。2つ目以降のクエリに指定したヒントは無視します。psqlコマンドで-cオプションで複数のクエリを指定した場合などにマルチステートメントで実行されます。</dd>
+<dt>IndexOnlyScanヒントの指定(PostgreSQL 9.2以降)</dt>
+<dd>IndexOnlyScanヒントを指定しても、ヒント対象となるテーブルに複数のインデックスが存在するときは、Index Scanが選択される場合があります。この場合は、IndexOnlyScanヒントに、テーブルだけでなくそのテーブルでIndex Only Scanを選択できるインデックスも指定してください。そのインデックスを使ったIndex Only Scanが選択されます。</dd>
+<dt>NoIndexScanヒントの注意点(PostgreSQL 9.2以降)</dt>
+<dd>PostgreSQL 9.2以降でNoIndexScanヒントを指定した場合は、Index ScanだけでなくIndex Only Scanも選択されません。</dd>
+</dl>
+
+<h3>ヒント指定エラーの扱い</h3>
+<dt>構文エラー</dt>
+<dd>ヒントの記述に構文上の誤りがあった場合、pg_hint_planは誤った記述より前のヒントのみ有効とし、誤った記述以降のヒントを無視してクエリを実行します。誤りの内容はpg_hint_plan.parse_messagesで指定したレベルでサーバログに記録されます。
+<ul>
+<li>ヒント名が間違っている。</li>
+<li>オブジェクト指定が正しく括弧で囲まれていない。</li>
+<li>オブジェクト名が空白で区切られていない。</li>
+</ul>
+</dd>
+<dt>オブジェクト指定エラー</dt>
+<dd>pg_hint_planは、ヒント対象のオブジェクト指定に誤りがあった場合、pg_hint_planは不正なヒントのみを無視し、それ以外のヒントを使ってっクエリを実行します。誤りの内容はpg_hint_plan.parse_messagesで指定したレベルでサーバログに記録されます。誤ったオブジェクト指定の例を以下に示します。</dd>
+<ul>
+<li>クエリ中に同じ名称のテーブル名または別名のテーブルがあり、それに対してヒントを指定した。</li>
+<li>結合方式や結合順のヒントに同じオブジェクト名を複数回指定した。</li>
+</ul>
+</dd>
+<dt>指定するヒントの種類の重複</dt>
+<dd>同じオブジェクトに対して同じグループのヒントを重複して指定した場合は、各グループで最後に指定したヒントを使用します。</dd>
+<dt>ネストしたブロックコメント</dt>
+<dd>pg_hint_planでは、ヒントを指定したブロックコメントにネストしたブロックコメントを含めることができません。ネストしたブロックコメントを含めた場合は、誤った記述に関する情報を出力しますがエラー終了しません。全てのヒントを無視してクエリを実行します。</dd>
+<dt>メッセージの出力レベル</dt>
+<dd>ヒントに誤りがあった場合に出力されるメッセージのレベルは、基本的にはpg_hint_plan.parse_messagesに指定したレベルです。ただし、ヒントに指定したオブジェクトの長さが識別子の最大長(デフォルトでは63バイト)を超えた際に切り詰めた場合は、NOTICEで出力します。</dd>
+
+<h3>機能制限</h3>
+<dt>標準のGUCパラメータの影響</dt>
+<dd>FROMリストの数がfrom_collapse_limitの設定値以上の場合、またはFROMリストの数がjoin_collapse_limitの設定値より大きい場合は、結合順序のヒントが無視されます。また、FROMリストの数がgeqo_thresholdの設定値以上の場合は、結合順序のヒント、および結合方式のヒントが無視されます。ヒントが使われるようにするには、これらのGUCパラメータの値を大きくしてください。</dd>
+<dt>ヒントで制御できないケース</dt>
+<dd>pg_hint_planでは、PostgreSQLのプランナが候補としてあげる事ができない実行計画をヒントに指定しても、その実行計画を生成することはできません。PostgreSQLのプランナが候補としてあげる事ができない実行計画の例を以下に示します。
+<ul>
+<li>FULL OUTER JOINではNested Loopは候補パスとして扱われません。</li>
+<li>WHERE句やJOIN条件などに指定されない列のみを含むインデックスは候補パスとして扱われません。</li>
+<li>検索条件にctidを指定しない場合はTid Scanは候補パスとして扱われません。</li>
+</ul>
+</dd>
+<dt>PL/pgSQLにおける制限</dt>
+<dd>PL/pgSQLでユーザ定義関数を実装する際に、関数定義内の各クエリの先頭にヒントを指定したとしても、そのヒントは無視します。ユーザ定義関数を実行するSELECTコマンドに指定したヒントを使用します。ただし、PL/pgSQLでは、関数定義内で指定したクエリがそのまま実行されるとは限らないため、ヒントを指定した場合の挙動は保証できません。</dd>
+<dt>ECPGにおける制限</dt>
+<dd>pg_hint_planでは、ECPGで実装したアプリケーションから発行するクエリは、基本的に実行計画を制御できません。これは、CプリプロセッサがCコードに変換するタイミングで、全てのブロックコメントを取り除いてしまうためです。ただし、C言語文字列に格納したクエリをEXECUTEコマンドで実行する動的SQLの場合は、クエリ文字列の先頭にヒントを指定することで実行計画を制御できます。</dd>
+<dt>psqlのフェッチ件数指定</dt>
+<dd>psqlコマンドのFETCH_COUNT変数に0より大きな整数値を指定すると、pg_hint_planでは実行計画を制御できなくなります。FETCH_COUNT変数に0より大きな整数値を指定すると、ユーザが指定したクエリの先頭に「DECLARE _psql_cursor NO SCROLL CURSOR FOR」が自動的に追加されてクエリが発行されることにより、ヒントがクエリの先頭ではなくなってしまうためです。</dd>
+<dt>ヒントによるフィンガープリントの変化</dt>
+<dd>pg_hint_planはSQLコメントでヒントを指定するため、SQL文フィンガープリントベースのクエリキャッシュなどでは、ヒントが異なれば別のSQL文として扱われます。pg_stat_statementも9.1では別クエリとして集計しますが、9.2ではクエリ集約機能によりコメントが除去されるので、ヒントのみが異なるクエリは同じクエリとして扱われます。</dd>
+<pre>
+postgres=# /*+ <span class="strong">MergeJoin(a *VALUES*)</span> */
+postgres-# EXPLAIN SELECT *
+postgres-#    FROM pgbench_accounts a
+postgres-#    JOIN (VALUES (1,1),(2,2)) <span class="strong">v</span> (vid, vbalance) ON a.aid = v.vid
+postgres-#   ORDER BY a.aid;
+                                                  QUERY PLAN
+---------------------------------------------------------------------------------------------------------------
+ <span class="strong">Merge Join</span>  (cost=0.04..4497.33 rows=2 width=105)
+   Merge Cond: (a.aid = "*VALUES*".column1)
+   ->  Index Scan using pgbench_accounts_pkey on pgbench_accounts a  (cost=0.00..4247.26 rows=100000 width=97)
+   ->  Sort  (cost=0.04..0.04 rows=2 width=8)
+         Sort Key: "*VALUES*".column1
+         ->  Values Scan on <span class="strong">"*VALUES*"</span>  (cost=0.00..0.03 rows=2 width=8)
+(6 行)
+
+postgres=#</pre>
+<dt>Setヒントの制限</dt>
+<dd>Setヒントに<a href="#hint-GUC">pg_hint_planのGUCパラメータ</a>を指定することはできますが、期待通りの動作をしないため、指定しないことをおすすめします。指定した場合の実際の動作を、以下に示します。
+<ul>
+<li>pg_hint_plan.enable_hintおよびpg_hint_plan.debug_printを指定した場合は、無視されます。</li>
+<li>pg_hint_plan.parse_messagesを指定した場合は、構文エラーと一部のSetヒントのエラーについてはクエリ開始時の設定レベルで出力され、それ以外のメッセージについてはSetヒントで指定したレベルで出力されます。</li>
+</ul>
+</dd>
+
 </dl>
 
 <h2 id="seealso">関連項目</h2>
 <h3 id="postgresql_document">PostgreSQLドキュメント</h3>
 <a href="http://www.postgresql.org/docs/9.1/static/sql-explain.html">EXPLAIN</a>
+<a href="http://www.postgresql.org/docs/9.1/static/sql-set.html">SET</a>
+<a href="http://www.postgresql.org/docs/9.1/static/runtime-config.html">サーバの設定</a>
 <hr>
 
 <div class="navigation">