OSDN Git Service

マニュアルを更新した。
authorRyohei OKADA <okada.ryohei@metrosystems.co.jp>
Thu, 27 Jun 2013 10:26:16 +0000 (19:26 +0900)
committerRyohei OKADA <okada.ryohei@metrosystems.co.jp>
Thu, 27 Jun 2013 10:26:16 +0000 (19:26 +0900)
ヒント用テーブル方式の記述を追加した。
OSSCからのレビューを反映した。

doc/hint_list-ja.html
doc/pg_hint_plan-ja.html

index cb18046..5aa914e 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD html 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
-<title>Appendix A. ヒント一覧</title>
+<title>Appendix A. ヒント一覧</title>
 <!-- Uncoment after the tool has been hosted somewhere.
 <link rel="home" title="pg_hint_plan" href="index.html">
 -->
 <h1 id="pg_hint_plan">pg_hint_plan 1.1.0</h1>
 <div class="navigation">
   <a href="pg_hint_plan-ja.html">pg_hint_plan</a> &gt;
-  <a href="hint_list-ja.html">Appendix A. ヒント一覧</a>
+  <a href="hint_list-ja.html">Appendix A. ヒント一覧</a>
 </div>
 <hr>
 
-<h2 id="hint-list">Appendix A. ヒント一覧</h2>
-<p>pg_hint_planで指定できるヒントは以下の通りです。</p>
+<h2 id="hint-list">Appendix A. ヒント一覧</h2>
+<p>pg_hint_planで指定できるヒントは以下の通りです。</p>
 <table>
 <thead>
 <tr>
-<tr><th>グループ</th><th>ヒントの書式</th><th>説明</th></tr>
+<tr><th>グループ</th><th>ヒントの書式</th><th>説明</th></tr>
 </tr>
 </thead>
 <tbody>
@@ -87,7 +87,7 @@ PostgreSQL 9.2以降で動作します。</td></tr>
 <hr>
 <div class="navigation">
   <a href="pg_hint_plan-ja.html">pg_hint_plan</a> &gt;
-  <a href="hint_list-ja.html">Appendix A. ヒント一覧</a>
+  <a href="hint_list-ja.html">Appendix A. ヒント一覧</a>
 </div>
 
 <p class="footer">Copyright (c) 2012-2013, NIPPON TELEGRAPH AND TELEPHONE CORPORATION</p>
index ff41630..8b878b7 100644 (file)
 <li><a href="#description">機能説明</a>
 <li><a href="#install">インストール</a></li>
 <li><a href="#uninstall">アンインストール</a></li>
-<li><a href="#examples">使用例</a></li>
 <li><a href="#restrictions">使用上の注意と制約</a></li>
 <li><a href="#requirement">動作環境</a></li>
 <li><a href="#seealso">関連項目</a></li>
-<li><a href="hint_list-ja.html">Appendix A. ヒント一覧</a></li>
+<li><a href="hint_list-ja.html">Appendix A. ヒント一覧</a></li>
 </div>
 
 <h2 id="name">名前</h2>
-<p>pg_hint_plan -- クエリに対してヒントを指定することで、SQL文やGUCパラメータを変えずに実行計画を制御します。</p>
+<p>pg_hint_plan -- 実行計画を示すヒントをクエリに指定することで、SQL文やGUCパラメータを変えずに実行計画を制御します。</p>
 
 <h2 id="synopsis">概要</h2>
-<p>PostgreSQLはコストベースオプティマイザを採用しており、SQL文と統計情報を元に可能なアクセスパスのコストを見積もり、最もコストの低い実行計画を選択します。オプティマイザは可能な限りよい実行計画を作成しようとしますが、カラム間の相関関係などは考慮しないため、複雑なクエリでは常に最適なプランが選択されるとは限りません。</p>
+<p>PostgreSQLはコストベースオプティマイザを採用しており、SQL文と統計情報を元に可能な実行計画のコストを見積もり、最もコストの低い実行計画を選択します。オプティマイザは可能な限りよい実行計画を作成しようとしますが、カラム間の相関関係などは考慮しないため、複雑なクエリでは常に最適なプランを選択するとは限りません。</p>
 <p>pg_hint_planを用いると、ヒントでスキャン方式や結合方式を指定することで、SQL文やGUCパラメータを変更することなく実行計画を制御することができます。</p>
 
 <h2 id="description">機能説明</h2>
-<p>pg_hint_planの機能について説明します。</p>
+<p>pg_hint_planの機能について説明するにあたり、まず文中で使用されている用語について説明します。</p>
+<table>
+<thead>
+<tr>
+<tr><th>用語</th><th>説明</th></tr>
+</tr></thead>
+<tbody>
+<tr><td>ヒント句</td>
+  <td>実行計画を制御する情報。</td></tr>
+  <tr><td>ヒント</td>
+  <td>実行計画を制御したい対象のクエリに適用するヒント句群。</td></tr>
+</tbody>
+</table>
 
 <h3 id="hint-rule">ヒントの指定方法</h3>
 <p>ヒントは二つの方法で指定することができます。</p>
 <p>特殊なSQLブロックコメント内にヒントを記述します。</p>
 <li>テーブルでの指定</li>
 <p>ヒント用のテーブルにヒントを登録します。</p>
+<p>特定のアプリケーションではヒントをコメントで指定することができないため、「テーブルでの指定」ができます。「コメントでの指定」と異なり、アプリケーションのソースコードに手を入れずに指定するヒントを変更することができます。</p>
 </ul>
 
 <h4 id="hint-comment">コメントでの指定</h4>
 <p>指定したいヒントを、実行計画を制御したいクエリの先頭または途中のSQLブロックコメントの中に記述します。</p>
-<p>ã\83\92ã\83³ã\83\88ç\94¨ã\82³ã\83¡ã\83³ã\83\88ã\81¨é\80\9a常ã\81®ã\82³ã\83¡ã\83³ã\83\88ã\82\92å\8cºå\88¥ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81ã\83\92ã\83³ã\83\88ç\94¨ã\81®ã\83\96ã\83­ã\83\83ã\82¯ã\82³ã\83¡ã\83³ã\83\88ã\81¯ã\80\8c<span class="bold">/*+</span>ã\80\8dã\81§å§\8bã\82\81ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\83\92ã\83³ã\83\88ã\81®å¯¾è±¡ã\81¯ã\80\81ã\82«ã\83\83ã\82³å\86\85ã\81«ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\90\8dã\81¾ã\81\9fã\81¯å\88¥å\90\8dã\81§æ\8c\87å®\9aã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\90\8dã\81¯ã\80\81ã\82¹ã\83\9aã\83¼ã\82¹ã\80\81ã\82¿ã\83\96ã\80\81ã\81¾ã\81\9fã\81¯æ\94¹è¡\8cã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\81§å\8cºå\88\87ã\81£ã\81¦æ\8c\87å®\9aã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。</p>
-<p>以下の例では、HashJoinとSeqScanヒントにより、pgbench_accountsテーブルに対するSeq Scanの結果をHash Joinする実行計画が選択されています。</p>
+<p>ã\83\92ã\83³ã\83\88ç\94¨ã\82³ã\83¡ã\83³ã\83\88ã\81¨é\80\9a常ã\81®ã\82³ã\83¡ã\83³ã\83\88ã\82\92å\8cºå\88¥ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81ã\83\92ã\83³ã\83\88ç\94¨ã\81®ã\83\96ã\83­ã\83\83ã\82¯ã\82³ã\83¡ã\83³ã\83\88ã\81¯ã\80\8c<span class="bold">/*+</span>ã\80\8dã\81§å§\8bã\82\81ã\81¾ã\81\99ã\80\82ã\83\92ã\83³ã\83\88ã\81®å¯¾è±¡ã\81¯ã\80\81ã\82«ã\83\83ã\82³å\86\85ã\81«ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\90\8dã\81¾ã\81\9fã\81¯å\88¥å\90\8dã\81§æ\8c\87å®\9aã\81\97ã\81¾ã\81\99ã\80\82ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\90\8dã\81¯ã\80\81ã\82¹ã\83\9aã\83¼ã\82¹ã\80\81ã\82¿ã\83\96ã\80\81ã\81¾ã\81\9fã\81¯æ\94¹è¡\8cã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\81§å\8cºå\88\87ã\81£ã\81¦æ\8c\87å®\9aã\81\97ã\81¾ã\81\99。</p>
+<p>以下の例では、HashJoinとSeqScanヒント句により、pgbench_accountsテーブルに対するSeq Scanの結果をHash Joinする実行計画が選択されています。なおかつ、Setヒント句によりこのクエリの実行計画を作成する間だけrandom_page_costが2.0に変更されています。</p>
 <pre>
 postgres=# EXPLAIN (VERBOSE, COSTS)
 postgres-# /*+
-postgres*#    <span class="strong">HashJoin(a b)</span>
-postgres*#    <span class="strong">SeqScan(a)</span>
+postgres*#     SeqScan(a)
+postgres*#     HashJoin(a b)
+postgres*#     Set(random_page_cost 2.0)
 postgres*#  */
 postgres-# SELECT *
-postgres-#    FROM pgbench_accounts a
-postgres-#    JOIN pgbench_branches b ON a.bid = b.bid
-postgres-#   ORDER BY a.aid;
-                                          QUERY PLAN
-----------------------------------------------------------------------------------------------
- Sort  (cost=54026.84..54276.84 rows=100000 width=461)
+postgres-#   FROM pgbench_accounts a
+postgres-#   JOIN pgbench_branches b
+postgres-#     ON a.bid = b.bid
+postgres-#  ORDER BY a.aid
+postgres-#  LIMIT 10;
+                                             QUERY PLAN
+----------------------------------------------------------------------------------------------------
+ Limit  (cost=6176.99..6177.01 rows=10 width=461)
    Output: a.aid, a.bid, a.abalance, a.filler, b.bid, b.bbalance, b.filler, a.aid
-   Sort Key: a.aid
-   ->  <span class="strong">Hash Join</span>  (cost=1.02..4016.02 rows=100000 width=461)
+   ->  Sort  (cost=6176.99..6426.99 rows=100000 width=461)
          Output: a.aid, a.bid, a.abalance, a.filler, b.bid, b.bbalance, b.filler, a.aid
-         Hash Cond: (a.bid = b.bid)
-         ->  <span class="strong">Seq Scan on public.pgbench_accounts a</span>  (cost=0.00..2640.00 rows=100000 width=97)
-               Output: a.aid, a.bid, a.abalance, a.filler
-         ->  Hash  (cost=1.01..1.01 rows=1 width=364)
-               Output: b.bid, b.bbalance, b.filler
-               ->  Seq Scan on public.pgbench_branches b  (cost=0.00..1.01 rows=1 width=364)
+         Sort Key: a.aid
+         ->  <span class="strong">Hash Join</span>  (cost=1.02..4016.02 rows=100000 width=461)
+               Output: a.aid, a.bid, a.abalance, a.filler, b.bid, b.bbalance, b.filler, a.aid
+               Hash Cond: (a.bid = b.bid)
+               ->  <span class="strong">Seq Scan on public.pgbench_accounts a</span>  (cost=0.00..2640.00 rows=100000 width=97)
+                     Output: a.aid, a.bid, a.abalance, a.filler
+               ->  Hash  (cost=1.01..1.01 rows=1 width=364)
                      Output: b.bid, b.bbalance, b.filler
-(12 rows)
+                     ->  Seq Scan on public.pgbench_branches b  (cost=0.00..1.01 rows=1 width=364)
+                           Output: b.bid, b.bbalance, b.filler
+(14 rows)
 
 postgres=# 
 </pre>
 
 <h4 id="hint-table">テーブルでの指定</h4>
 <p>指定したいヒントを、実行計画を制御したいクエリと併せてヒント用のテーブルに登録します。</p>
-<p>ヒントは、「<span class="bold">hint_plan.hints</span>」テーブルに登録してください。</p>
-<p>以下の例は、テーブルに登録したヒントと、該当するクエリの実行結果を示しています。</p>
-<pre>
-postgres=# select * from hint_plan.hints ;
-                    norm_query_string                    | application_name |   hints
----------------------------------------------------------+------------------+------------
- EXPLAIN SELECT * FROM pgbench_accounts a WHERE aid = ?; | psql             | SeqScan(a)
-...
-
-postgres=# EXPLAIN SELECT * FROM pgbench_accounts a WHERE aid = 1;
-                              QUERY PLAN
-----------------------------------------------------------------------
- <span class="strong">Seq Scan on pgbench_accounts a</span>  (cost=0.00..2890.00 rows=1 width=97)
-   Filter: (aid = 1)
-(2 rows)
-</pre>
-<p>hint_plan.hintsテーブルには、以下の情報を登録します。</p>
+<p>デフォルトではテーブルで指定したヒントは使用されません。ヒントをテーブルで指定する場合は、<a href="#hint-GUC">pg_hint_planのGUCパラメータ</a>pg_hint_plan.enable_hint_tableの設定を変更します。</p>
+<p>ヒント用のテーブルは「<span class="bold">hint_plan.hints</span>」です。hint_plan.hintsテーブルには、以下の情報を登録します。</p>
 <table>
 <thead>
 <tr>
@@ -108,37 +110,68 @@ postgres=# EXPLAIN SELECT * FROM pgbench_accounts a WHERE aid = 1;
 </tr></thead>
 <tbody>
 <tr><td>norm_query_string</td>
-  <td>å®\9fè¡\8cè¨\88ç\94»ã\82\92å\88¶å¾¡ã\81\97ã\81\9fã\81\84ã\82¯ã\82¨ã\83ªã\82\92æ\8c\87å®\9aã\81\97ã\81¾ã\81\99ã\80\82対象ã\81®ã\82¯ã\82¨ã\83ªã\81«å®\9aæ\95°ã\81\8cã\81\82ã\82\8bã\81¨ã\81\8dã\81¯ã\80\81ä¸\8aè¨\98ã\81®ä¾\8bã\81®ã\82\88ã\81\86ã\81«ã\80\8c\80\8dã\81«ç½®ã\81\8dæ\8f\9bã\81\88ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。</td></tr>
+  <td>å®\9fè¡\8cè¨\88ç\94»ã\82\92å\88¶å¾¡ã\81\97ã\81\9fã\81\84ã\82¯ã\82¨ã\83ªã\82\92æ\8c\87å®\9aã\81\97ã\81¾ã\81\99ã\80\82対象ã\81®ã\82¯ã\82¨ã\83ªã\81«å®\9aæ\95°ã\81\8cã\81\82ã\82\8bã\81¨ã\81\8dã\81¯ã\80\81ä¸\8bè¨\98ã\81®ä¾\8bã\81®ã\82\88ã\81\86ã\81«ã\80\8c\80\8dã\81«ç½®ã\81\8dæ\8f\9bã\81\88ã\81¾ã\81\99ã\80\82ã\82­ã\83¼ã\83¯ã\83¼ã\83\89é\96\93ã\81®ç©ºç\99½ã\81®æ\95°ã\81\8cã\80\81ç\99»é\8c²ã\81\99ã\82\8bã\82¯ã\82¨ã\83ªã\81¨å®\9fè¡\8cã\81\99ã\82\8bã\82¯ã\82¨ã\83ªã\81§ç\95°ã\81ªã\82\8bã\81¨å\88¥ã\81®SQLæ\96\87ã\81¨ã\81\97ã\81¦æ\89±ã\82\8fã\82\8cã\81¾ã\81\99。</td></tr>
 <tr><td>application_name</td>
-  <td>ã\83\92ã\83³ã\83\88é\81©ç\94¨å¯¾è±¡ã\81®ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³å\90\8dã\82\92æ\8c\87å®\9aã\81\97ã\81¾ã\81\99ã\80\82ä¸\8aè¨\98ã\81®ä¾\8bã\81§ã\81¯ã\80\8cpsqlã\80\8dã\81\8bã\82\89å®\9fè¡\8cã\81\95ã\82\8cã\81\9fã\82¯ã\82¨ã\83ªã\81®ã\81¿ã\81\8cã\83\92ã\83³ã\83\88é\81©ç\94¨å¯¾è±¡ã\81¨ã\81ªã\81£ã\81¦ã\81\84ã\81¾ã\81\99ã\81\8cã\80\81å\85¨ã\81¦ã\81®ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81«ã\83\92ã\83³ã\83\88ã\82\92é\81©ç\94¨ã\81\95ã\81\9bã\81\9fã\81\84ã\81¨ã\81\8dã\81¯ã\80\81空æ\96\87å­\97å\88\97ã\82\92ç\99»é\8c²ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³å\90\8dã\81¯ã\80\81ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81®ã\80\8capplication_nameã\80\8dGUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81§判断します。</td></tr>
+  <td>ã\83\92ã\83³ã\83\88é\81©ç\94¨å¯¾è±¡ã\81®ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³å\90\8dã\82\92æ\8c\87å®\9aã\81\97ã\81¾ã\81\99ã\80\82ä¸\8bè¨\98ã\81®ä¾\8bã\81§ã\81¯ã\80\8cpsqlã\80\8dã\81\8bã\82\89å®\9fè¡\8cã\81\95ã\82\8cã\81\9fã\82¯ã\82¨ã\83ªã\81®ã\81¿ã\81\8cã\83\92ã\83³ã\83\88é\81©ç\94¨å¯¾è±¡ã\81¨ã\81ªã\82\8aã\81¾ã\81\99ã\80\82å\85¨ã\81¦ã\81®ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81«ã\83\92ã\83³ã\83\88ã\82\92é\81©ç\94¨ã\81\97ã\81\9fã\81\84ã\81¨ã\81\8dã\81¯ã\80\81空æ\96\87å­\97å\88\97ã\82\92ç\99»é\8c²ã\81\97ã\81¾ã\81\99ã\80\82ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³å\90\8dã\81¯ã\80\81ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81®ã\80\8capplication_nameã\80\8dGUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81¨ç­\89ã\81\97ã\81\84ã\81\8b判断します。</td></tr>
 <tr><td>hints</td>
   <td>ヒントを指定します。ヒント以外のもの(SQLコメントなど)を含めないでください。</td></tr>
 </tbody>
 </table>
-<p>「コメントでの指定」の例と同じヒントを指定するには、以下のヒント情報を登録します。</p>
+<p>以下の例では、テーブルに登録した「コメントでの指定」の例と同じヒントと、登録したクエリの実行結果を示しています。</p>
 <pre>
-postgres=# select * from hint_plan.hints;
-             norm_query_string              | application_name |          hints
---------------------------------------------+------------------+-------------------------
- EXPLAIN (VERBOSE, COSTS)                  +| psql             | HashJoin(a b)SeqScan(a)
- SELECT *                                  +|                  |
-   FROM pgbench_accounts a                 +|                  |
-   JOIN pgbench_branches b ON a.bid = b.bid+|                  |
-  ORDER BY a.aid;                           |                  |
+postgres=# SELECT * FROM hint_plan.hints;
+     norm_query_string     | application_name |                      hints
+---------------------------+------------------+--------------------------------------------------
+ EXPLAIN (VERBOSE, COSTS) +| psql             | SeqScan(a)HashJoin(a b)Set(random_page_cost 2.0)
+ SELECT *                 +|                  |
+   FROM pgbench_accounts a+|                  |
+   JOIN pgbench_branches b+|                  |
+     ON a.bid = b.bid     +|                  |
+  ORDER BY a.aid          +|                  |
+  LIMIT ?;                 |                  |
+...
+
+postgres=# SET pg_hint_plan.enable_hint_table TO on;
+postgres=# EXPLAIN (VERBOSE, COSTS)
+postgres-# SELECT *
+postgres-#   FROM pgbench_accounts a
+postgres-#   JOIN pgbench_branches b
+postgres-#     ON a.bid = b.bid
+postgres-#  ORDER BY a.aid
+postgres-#  LIMIT 10;
+                                             QUERY PLAN
+----------------------------------------------------------------------------------------------------
+ Limit  (cost=6176.99..6177.01 rows=10 width=461)
+   Output: a.aid, a.bid, a.abalance, a.filler, b.bid, b.bbalance, b.filler, a.aid
+   ->  Sort  (cost=6176.99..6426.99 rows=100000 width=461)
+         Output: a.aid, a.bid, a.abalance, a.filler, b.bid, b.bbalance, b.filler, a.aid
+         Sort Key: a.aid
+         ->  <span class="strong">Hash Join</span>  (cost=1.02..4016.02 rows=100000 width=461)
+               Output: a.aid, a.bid, a.abalance, a.filler, b.bid, b.bbalance, b.filler, a.aid
+               Hash Cond: (a.bid = b.bid)
+               ->  <span class="strong">Seq Scan on public.pgbench_accounts a</span>  (cost=0.00..2640.00 rows=100000 width=97)
+                     Output: a.aid, a.bid, a.abalance, a.filler
+               ->  Hash  (cost=1.01..1.01 rows=1 width=364)
+                     Output: b.bid, b.bbalance, b.filler
+                     ->  Seq Scan on public.pgbench_branches b  (cost=0.00..1.01 rows=1 width=364)
+                           Output: b.bid, b.bbalance, b.filler
+(14 rows)
+
+postgres=# 
 </pre>
 
 <div class="tips">
 <span class="strong">指定方法の優先度</span>
 <p>ヒントをコメントとテーブルの両方で指定した場合、テーブルで指定したヒントが適用され、コメントで指定したヒントは無視されます。</p>
-<p>以ä¸\8bã\81®ä¾\8bã\81§ã\81¯ã\80\81ã\82³ã\83¡ã\83³ã\83\88ã\81§ã\83\92ã\83³ã\83\88ã\82\92æ\8c\87å®\9aã\81\97ã\81¦å®\9fè¡\8cè¨\88ç\94»ã\82\92å\88¶å¾¡ã\81\97ã\81¦ã\81\84ã\82\8bã\82¯ã\82¨ã\83ªã\81«å¯¾ã\81\97ã\81¦ã\80\81ã\83\86ã\83¼ã\83\96ã\83«ã\81«ç©ºæ\96\87å­\97å\88\97ã\81®ã\83\92ã\83³ã\83\88ã\82\92ç\99»é\8c²ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82ã\81\93ã\81\86ã\81\99ã\82\8bã\81\93ã\81¨で、コメントで指定したヒントを取り消すことができます。</p>
+<p>以ä¸\8bã\81®ä¾\8bã\81§ã\81¯ã\80\81ã\82³ã\83¡ã\83³ã\83\88ã\81§ã\83\92ã\83³ã\83\88ã\82\92æ\8c\87å®\9aã\81\97ã\81¦å®\9fè¡\8cè¨\88ç\94»ã\82\92å\88¶å¾¡ã\81\97ã\81¦ã\81\84ã\82\8bã\82¯ã\82¨ã\83ªã\81«å¯¾ã\81\97ã\81¦ã\80\81ã\83\86ã\83¼ã\83\96ã\83«ã\81«ç©ºæ\96\87å­\97å\88\97ã\81®ã\83\92ã\83³ã\83\88ã\82\92ç\99»é\8c²ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82ã\83\86ã\83¼ã\83\96ã\83«ã\81§æ\8c\87å®\9aã\81\97ã\81\9fã\83\92ã\83³ã\83\88ã\81\8cå\84ªå\85\88ã\81\95ã\82\8cã\82\8bã\81®で、コメントで指定したヒントを取り消すことができます。</p>
 <pre>
 postgres=# select * from hint_plan.hints;
              norm_query_string              | application_name | hints
 --------------------------------------------+------------------+-------
  EXPLAIN (VERBOSE, COSTS)                  +| psql             |
  /*+                                       +|                  |
-   HashJoin(a b)                           +|                  |
-   SeqScan(a)                              +|                  |
+     HashJoin(a b)                         +|                  |
+     SeqScan(a)                            +|                  |
   */                                       +|                  |
  SELECT *                                  +|                  |
    FROM pgbench_accounts a                 +|                  |
@@ -148,8 +181,8 @@ postgres=# select * from hint_plan.hints;
 
 postgres=# EXPLAIN (VERBOSE, COSTS)
 postgres-# /*+
-postgres*#   HashJoin(a b)
-postgres*#   SeqScan(a)
+postgres*#     HashJoin(a b)
+postgres*#     SeqScan(a)
 postgres*#  */
 postgres-# SELECT *
 postgres-#   FROM pgbench_accounts a
@@ -170,31 +203,49 @@ postgres-#  ORDER BY a.aid;
 </pre>
 </div>
 
-<h3 id="hint-group">ヒントのグループ</h3>
-<p>pg_hint_planで使えるヒントは、スキャン方式と結合方式、結合順序、GUCパラメータの4グループに分けられます。各グループの具体的なヒントは、<a href="hint_list-ja.html">ヒント一覧</a>を参照してください。</p>
+<h3 id="hint-group">ヒントのグループ</h3>
+<p>pg_hint_planで使えるヒント句の種類は、スキャン方式と結合方式、結合順序、GUCパラメータの4グループに分けられます。各グループの具体的なヒント句は、<a href="hint_list-ja.html">ヒント句一覧</a>を参照します。</p>
 
 <h4>スキャン方式</h4>
-<p>あるオブジェクトでどのスキャン方式を選択するかを指定できるヒントのグループで、「SeqScan」や「IndexScan」などが含まれます。</p>
-<p>スキャン方式を指定できるオブジェクトは、通常のテーブル、継承テーブル、UNLOGGEDテーブル、一時テーブル、システムカタログです。スキャン方式を指定できないオブジェクトは、外部テーブル、テーブル関数、VALUESコマンド結果、CTE、ビュー、副問い合わせ結果です。</p>
-<p>特定のオブジェクトについてあるスキャン方式を選択して欲しい場合は、そのスキャン方式のヒントと、対象となるオブジェクトの名前を指定してください。逆に、特定のオブジェクトについてあるスキャン方式を選択して欲しくない場合は、Noで始まるヒントを指定してください。同じオブジェクトに対して複数のスキャン方式のヒントを指定した場合は、最後に指定したヒントが適用されます。</p>
+<p>あるオブジェクトでどのスキャン方式を選択するかを指定できるヒント句のグループです。「SeqScan」や「IndexScan」などを含みます。</p>
+<p>スキャン方式を指定できるオブジェクトは、通常のテーブル、継承テーブル、UNLOGGEDテーブル、一時テーブル、システムカタログです。スキャン方式を指定できないオブジェクトは、外部テーブル、テーブル関数、VALUESコマンド結果、CTE(共通テーブル式)、ビュー、副問い合わせ結果です。</p>
+<p>特定のオブジェクトについてあるスキャン方式を選択して欲しい場合は、そのスキャン方式のヒント句と、対象となるオブジェクトの名前を指定します。逆に、特定のオブジェクトについてあるスキャン方式を選択して欲しくない場合は、Noで始まるヒント句を指定します。同じオブジェクトに対して複数のスキャン方式のヒント句を指定した場合は、最後に指定したヒント句が適用されます。</p>
 
 <h4>結合方式</h4>
-<p>あるオブジェクトの組み合わせでどの結合方式を選択するかを指定できるヒントのグループで、「MergeJoin」や「NestLoop」などが含まれます。</p>
-<p>結合方式を指定できるオブジェクトは、通常のテーブル、継承テーブル、UNLOGGEDテーブル、一時テーブル、外部テーブル、システムカタログ、テーブル関数、VALUESコマンド結果、CTEです。結合方式を指定できないオブジェクトは、ビュー、副問い合わせ結果です。</p>
-<p>特定のオブジェクトの組み合わせについてある結合方式を選択して欲しい場合は、その結合方式のヒントと、対象となる2つ以上のオブジェクトの名前を指定してください。逆に、特定のオブジェクトの組み合わせについてある結合方式を選択して欲しくない場合は、Noで始まるヒントを指定してください。同じオブジェクトの組み合わせに対して複数の結合方式のヒントを指定した場合は、最後に指定したヒントが適用されます。</p>
+<p>あるオブジェクトの組み合わせでどの結合方式を選択するかを指定できるヒント句のグループです。「MergeJoin」や「NestLoop」などを含みます。</p>
+<p>結合方式を指定できるオブジェクトは、通常のテーブル、継承テーブル、UNLOGGEDテーブル、一時テーブル、外部テーブル、システムカタログ、テーブル関数、VALUESコマンド結果、CTE(共通テーブル式)です。結合方式を指定できないオブジェクトは、ビュー、副問い合わせ結果です。</p>
+<p>特定のオブジェクトの組み合わせについてある結合方式を選択して欲しい場合は、その結合方式のヒント句と、対象となる2つ以上のオブジェクトの名前を指定します。逆に、特定のオブジェクトの組み合わせについてある結合方式を選択して欲しくない場合は、Noで始まるヒント句を指定します。同じオブジェクトの組み合わせに対して複数の結合方式のヒント句を指定した場合は、最後に指定したヒント句が適用されます。</p>
+
 <h4>結合順序</h4>
-<p>あるオブジェクトの組み合わせでどのような順番で結合するかを指定できるヒントのグループで、「Leading」のみが含まれます。</p>
+<p>あるオブジェクトの組み合わせでどのような順番で結合するかを指定できるヒント句のグループです。「Leading」のみを含みます。</p>
 <p>結合順序を指定できるオブジェクトは結合方式と同じです。</p>
-<p>先に結合して欲しいオブジェクトから順にオブジェクト名または別名を指定してください。同じ問合せブロックのオブジェクトに対して複数の結合順序のヒントを指定した場合は、最後に指定したヒントが適用されます。 </p>
+<p>先に結合して欲しいオブジェクトから順にオブジェクト名または別名を指定します。同じ問合せブロックのオブジェクトに対して複数の結合順序のヒント句を指定した場合は、最後に指定したヒント句が適用されます。 </p>
+<div class="tips">
+<span class="strong"></span>
+<p>結合対象のテーブルが3つ以上ある場合、結合方式のヒント句を指定したとしてもコスト見積もりによっては対象のテーブルが直接結合されないことがあります。対象のテーブルが直接結合されない場合は、結合順序のヒント句を併せて指定します。</p>
+<p>以下の例では、table1とtable2を直接結合する場合はNested Loopを、table1とtable2とtable3を結合する場合はMerge Joinを指定しています。また、コスト見積もりによってはtable1とtable2が直接結合されない場合を避けるため、table1とtable2を結合してからtable3を結合するようにLeadingヒント句を併用しています。</p>
+<pre>
+postgres=# /*+
+postgres*#     NestLoop(t1 t2)
+postgres*#     MergeJoin(t1 t2 t3)
+postgres*#     Leading(t1 t2 t3)
+postgres*#  */
+postgres-# SELECT * FROM table1 t1
+postgres-#     JOIN table table2 t2 ON (t1.key = t2.key)
+postgres-#     JOIN table table3 t3 ON (t2.key = t3.key);
+...
+</pre>
+</div>
+
 <h4>GUCパラメータ</h4>
-<p>そのクエリの実行計画を作成している間だけGUCパラメータを変更できるヒントのグループで、「Set」のみが含まれます。</p>
-<p>設å®\9aã\81\97ã\81\9fã\81\84GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81¨ã\81\9dã\81®ã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®å\80¤ã\82\92æ\8c\87å®\9aã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82<a href="http://www.postgresql.jp/document/current/html/sql-set.html">SET</a>ã\82³ã\83\9eã\83³ã\83\89ã\81§æ\8c\87å®\9aã\81§ã\81\8dã\82\8bGUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81ªã\82\89ã\81°å\85¨ã\81¦æ\8c\87å®\9aã\81§ã\81\8dã\81¾ã\81\99ã\81\8cã\80\81å\8a¹æ\9e\9cã\81\8cã\81\82ã\82\8bã\81®ã\81¯<a href="http://www.postgresql.jp/document/current/html/runtime-config-query.html">å\95\8fã\81\84å\90\88ã\82\8fã\81\9bè¨\88ç\94»</a>ã\81®GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®ã\81¿ã\81§ã\81\99ã\80\82å\90\8cã\81\98GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81«å¯¾ã\81\97ã\81¦è¤\87æ\95°ã\81®GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®ã\83\92ã\83³ã\83\88ã\82\92æ\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が適用されます。</p>
+<p>そのクエリの実行計画を作成している間だけGUCパラメータを変更できるヒント句のグループです。「Set」のみを含みます。</p>
+<p>設å®\9aã\81\97ã\81\9fã\81\84GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81¨ã\81\9dã\81®ã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®å\80¤ã\82\92æ\8c\87å®\9aã\81\97ã\81¾ã\81\99ã\80\82æ\8c\87å®\9aã\81§ã\81\8dã\82\8bGUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81¯<a href="http://www.postgresql.jp/document/current/html/runtime-config-query.html">å\95\8fã\81\84å\90\88ã\82\8fã\81\9bè¨\88ç\94»</a>ã\81®GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®ã\81¿ã\81§ã\81\99ã\80\82å\90\8cã\81\98GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®ã\83\92ã\83³ã\83\88å\8f¥ã\82\92\9b\9e以ä¸\8aæ\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å\8f¥が適用されます。</p>
 <div class="tips">
-<span class="strong">Setヒントの制限</span>
-<p>Setヒントに<a href="#hint-GUC">pg_hint_planのGUCパラメータ</a>を指定することはできますが、期待通りの動作をしないため、指定しないことをおすすめします。指定した場合の実際の動作を、以下に示します。<p>
+<span class="strong">Setヒントの制限</span>
+<p>Setヒント句に問い合わせ計画のGUCパラメータ以外を指定した場合の動作は保証できません。問い合わせ計画以外のGUCパラメータを指定した場合の例の一つとして、<a href="#hint-GUC">pg_hint_planのGUCパラメータ</a>を指定した場合の動作を、以下に示します。<p>
 <ul>
-<li>pg_hint_plan.enable_hintおよびpg_hint_plan.debug_printを指定した場合は、無視されます。</li>
-<li>pg_hint_plan.parse_messagesを指定した場合は、構文エラーと一部のSetヒントのエラーについてはクエリ開始時の設定レベルで出力され、それ以外のメッセージについてはSetヒントで指定したレベルで出力されます。</li>
+<li>pg_hint_plan.enable_hintã\80\81pg_hint_plan.enable_hint_tableã\81\8aã\82\88ã\81³pg_hint_plan.debug_printã\82\92æ\8c\87å®\9aã\81\97ã\81\9få ´å\90\88ã\81¯ã\80\81ç\84¡è¦\96ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82</li>
+<li>pg_hint_plan.parse_messagesを指定した場合は、構文エラーと一部のSetヒント句のエラーはクエリ開始時の設定レベルで出力され、それ以外のメッセージはSetヒント句で指定したレベルで出力されます。</li>
 </ul>
 </div>
 
@@ -208,10 +259,13 @@ postgres-#  ORDER BY a.aid;
 <tbody>
 <tr><td>pg_hint_plan.enable_hint</td>
   <td>pg_hint_planの機能を有効または無効にします。</td><td>on</td></tr>
+<tr><td>pg_hint_plan.enable_hint_table</td>
+  <td>ヒントをテーブルで指定する機能を有効または無効にします。</td><td>off</td></tr>
 <tr><td>pg_hint_plan.debug_print</td>
   <td>指定したヒントが実行計画生成にどのように影響したかを出力します。メッセージはLOGメッセージレベルで出力されますので、デフォルトではサーバログに出力され、クライアントには渡されません。</td><td>off</td></tr>
 <tr><td>pg_hint_plan.parse_messages</td>
   <td>指定したヒントを解釈できなかった場合に、どのメッセージ階層でログを出力するかを指定します。有効な値は、debug5、debug4、debug3、debug2、debug1、log、info、notice、warning、またはerrorです。fatalとpanicは指定できません。</td><td>info</td></tr>
+
 </tbody>
 </table>
 <p>
@@ -233,7 +287,7 @@ PostgreSQL 9.2以降ではcustom_variable_classesは廃止されているため
 <p>pg_hint_planのインストール方法について説明します。</p>
 
 <h3 id="build">ビルド</h3>
-<p>pg_hint_planã\82\92ã\82½ã\83¼ã\82¹ã\82³ã\83¼ã\83\89ã\81\8bã\82\89ã\83\93ã\83«ã\83\89ã\81\99ã\82\8bå ´å\90\88ã\80\81pg_hint_planã\81®ã\82½ã\83¼ã\82¹ã\82\92å±\95é\96\8bã\81\97ã\81\9fã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81§make â\86\92 make installã\81®é \86ã\81«å®\9fè¡\8cã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82make installã\81¯PostgreSQLã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97ã\81\9fOSã\83¦ã\83¼ã\82¶ã\81§å®\9fè¡\8cã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。なお、pg_hint_planのビルドにはpgxsを使用するので、RPM版のPostgreSQLを使用している環境では、postgresql-devel パッケージが必要です。</p>
+<p>pg_hint_planã\82\92ã\82½ã\83¼ã\82¹ã\82³ã\83¼ã\83\89ã\81\8bã\82\89ã\83\93ã\83«ã\83\89ã\81\99ã\82\8bå ´å\90\88ã\80\81pg_hint_planã\81®ã\82½ã\83¼ã\82¹ã\82\92å±\95é\96\8bã\81\97ã\81\9fã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81§make â\86\92 make installã\81®é \86ã\81«å®\9fè¡\8cã\81\97ã\81¾ã\81\99ã\80\82make installã\81¯PostgreSQLã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97ã\81\9fOSã\83¦ã\83¼ã\82¶ã\81§å®\9fè¡\8cã\81\97ã\81¾ã\81\99。なお、pg_hint_planのビルドにはpgxsを使用するので、RPM版のPostgreSQLを使用している環境では、postgresql-devel パッケージが必要です。</p>
 <p>以下にビルドの例を示します。</p>
 <pre>
 $ tar xzvf pg_hint_plan-1.0.0.tar.gz
@@ -244,19 +298,19 @@ $ su
 </pre>
 
 <h3 id="create-extension">データベースへの登録</h3>
-<p>pg_hint_planã\81¯PostgreSQLã\81®æ\8b¡å¼µ(EXTENSION)ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bã\81®ã\81§ã\80\81pg_hint_planã\82\92å\88©ç\94¨ã\81\99ã\82\8bã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\82¹ã\83¼ã\83\91ã\83¼ã\83¦ã\83¼ã\82¶ã\82\82ã\81\97ã\81\8fã\81¯ã\81\9dã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®æ\89\80æ\9c\89è\80\85ã\81§æ\8e¥ç¶\9aã\81\97ã\81¦CREATE EXTENSIONã\82³ã\83\9eã\83³ã\83\89ã\82\92å®\9fè¡\8cã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。</p>
+<p>pg_hint_planã\81¯PostgreSQLã\81®æ\8b¡å¼µ(EXTENSION)ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bã\81®ã\81§ã\80\81pg_hint_planã\82\92å\88©ç\94¨ã\81\99ã\82\8bã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\82¹ã\83¼ã\83\91ã\83¼ã\83¦ã\83¼ã\82¶ã\82\82ã\81\97ã\81\8fã\81¯ã\81\9dã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®æ\89\80æ\9c\89è\80\85ã\81§æ\8e¥ç¶\9aã\81\97ã\81¦CREATE EXTENSIONã\82³ã\83\9eã\83³ã\83\89ã\82\92å®\9fè¡\8cã\81\97ã\81¾ã\81\99。</p>
 <p>以下にデータベースへの登録の例を示します。 <i>dbname</i>は対象となるデータベース名を意味します。</p>
 <pre>
 $ psql -d <i>dbname</i> -c "CREATE EXTENSION pg_hint_plan"
 </pre>
 
 <h3 id="hint-load">pg_hint_planのロード</h3>
-<p>ç\89¹å®\9aã\81®ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81§ã\81®ã\81¿pg_hint_planã\82\92使ã\81\86å ´å\90\88ã\81¯ã\80\81以ä¸\8bã\81®ä¾\8bã\81®ã\82\88ã\81\86ã\81«pg_hint_planã\81®å\85±æ\9c\89ã\83©ã\82¤ã\83\96ã\83©ã\83ªã\82\92LOADã\82³ã\83\9eã\83³ã\83\89ã\81§ã\83­ã\83¼ã\83\89ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ä¸\80è\88¬ã\83¦ã\83¼ã\82¶ã\81§å\88©ç\94¨ã\81\99ã\82\8bå ´å\90\88ã\81¯$libdir/pluginsã\81«ã\82\82ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8bã\81®ã\81§æ³¨æ\84\8fã\81\97ã\81¦ä¸\8bさい。
+<p>ç\89¹å®\9aã\81®ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81§ã\81®ã\81¿pg_hint_planã\82\92使ã\81\86å ´å\90\88ã\81¯ã\80\81以ä¸\8bã\81®ä¾\8bã\81®ã\82\88ã\81\86ã\81«pg_hint_planã\81®å\85±æ\9c\89ã\83©ã\82¤ã\83\96ã\83©ã\83ªã\82\92LOADã\82³ã\83\9eã\83³ã\83\89ã\81§ã\83­ã\83¼ã\83\89ã\81\97ã\81¾ã\81\99ã\80\82ä¸\80è\88¬ã\83¦ã\83¼ã\82¶ã\81§å\88©ç\94¨ã\81\99ã\82\8bå ´å\90\88ã\81¯$libdir/pluginsã\81«ã\82\82ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8bã\81®ã\81§æ³¨æ\84\8fã\81\97ã\81¦ã\81\8fã\81 さい。
 <pre>
 postgres=# LOAD 'pg_hint_plan';
 LOAD
 postgres=# </pre></p>
-<p>å\85¨ã\81¦ã\81®ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81§pg_hint_planã\82\92æ\9c\89å\8a¹ã\81«ã\81\99ã\82\8bã\81«ã\81¯ã\80\81shared_preload_libraries GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81«'pg_hint_plan'ã\82\92追å\8a ã\81\97ã\81¦ã\81\8bã\82\89ã\82µã\83¼ã\83\90ã\82\92å\86\8dèµ·å\8b\95ã\81\97ã\81¦ä¸\8bã\81\95ã\81\84。</p>
+<p>å\85¨ã\81¦ã\81®ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81§pg_hint_planã\82\92æ\9c\89å\8a¹ã\81«ã\81\99ã\82\8bã\81«ã\81¯ã\80\81shared_preload_libraries GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81«'pg_hint_plan'ã\82\92追å\8a ã\81\97ã\81¦ã\81\8bã\82\89ã\82µã\83¼ã\83\90ã\82\92å\86\8dèµ·å\8b\95ã\81\97ã\81¾ã\81\99。</p>
 <p>注意: pg_hint_planを<a href="#create-extension">データベースに登録</a>せずに、ロード後にSQL文を実行すると以下に示す例のようなエラーとなります。 pg_hint_planを使うときは、データベースへの登録を忘れないように注意してください。</p>
 <pre>
 postgres=# EXPLAIN SELECT * FROM pgbench_accounts a WHERE aid = 1;
@@ -268,67 +322,27 @@ postgres=#
 </pre>
 
 <h2 id="uninstall">アンインストール</h2>
-<p>pg_hint_planã\82\92ã\82¢ã\83³ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\99ã\82\8bã\81¨ã\81\8dã\81¯ã\80\81以ä¸\8bã\81®æ\89\8bé \86ã\82\92å®\9fè¡\8cã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。 <i>dbname</i>は対象となるデータベース名を意味します。</p>
+<p>pg_hint_planã\82\92ã\82¢ã\83³ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\99ã\82\8bã\81¨ã\81\8dã\81¯ã\80\81以ä¸\8bã\81®æ\89\8bé \86ã\82\92å®\9fè¡\8cã\81\97ã\81¾ã\81\99。 <i>dbname</i>は対象となるデータベース名を意味します。</p>
 <ol>
-<li>pg_hint_planã\81®ã\82½ã\83¼ã\82¹ã\82\92å±\95é\96\8bã\81\97ã\81\9fã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81§make uninstallã\82\92å®\9fè¡\8cã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82make uninstallã\81¯PostgreSQLã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97ã\81\9fOSã\83¦ã\83¼ã\82¶ã\81§å®\9fè¡\8cã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。</li>
+<li>pg_hint_planã\81®ã\82½ã\83¼ã\82¹ã\82\92å±\95é\96\8bã\81\97ã\81\9fã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81§make uninstallã\82\92å®\9fè¡\8cã\81\97ã\81¾ã\81\99ã\80\82make uninstallã\81¯PostgreSQLã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97ã\81\9fOSã\83¦ã\83¼ã\82¶ã\81§å®\9fè¡\8cã\81\97ã\81¾ã\81\99。</li>
 <pre>
 $ cd pg_hint_plan-1.0.0
 $ su
 # make uninstall
 </pre>
-<li>pg_hint_planã\82\92ç\99»é\8c²ã\81\97ã\81\9fã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\82¹ã\83¼ã\83\91ã\83¼ã\83¦ã\83¼ã\82¶ã\82\82ã\81\97ã\81\8fã\81¯ã\81\9dã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®æ\89\80æ\9c\89è\80\85ã\81§æ\8e¥ç¶\9aã\81\97ã\81¦ã\80\81DROP EXTENSIONã\82³ã\83\9eã\83³ã\83\89ã\81\8aã\82\88ã\81³DROP SCHEMAã\82³ã\83\9eã\83³ã\83\89ã\82\92å®\9fè¡\8cã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。</li>
+<li>pg_hint_planã\82\92ç\99»é\8c²ã\81\97ã\81\9fã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\82¹ã\83¼ã\83\91ã\83¼ã\83¦ã\83¼ã\82¶ã\82\82ã\81\97ã\81\8fã\81¯ã\81\9dã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®æ\89\80æ\9c\89è\80\85ã\81§æ\8e¥ç¶\9aã\81\97ã\81¦ã\80\81DROP EXTENSIONã\82³ã\83\9eã\83³ã\83\89ã\81\8aã\82\88ã\81³DROP SCHEMAã\82³ã\83\9eã\83³ã\83\89ã\82\92å®\9fè¡\8cã\81\97ã\81¾ã\81\99。</li>
 <pre>
 $ psql -d <i>dbname</i> -c "DROP EXTENSION pg_hint_plan"
 $ psql -d <i>dbname</i> -c "DROP SCHEMA hint_plan"
 </pre>
 </ol>
 
-<h2 id="examples">使用例</h2>
-<h3>スキャン方式</h3>
-<p>スキャン方式のヒントでは、スキャン対象のテーブルを指定します。IndexScanヒントで特定のインデックスを使用したい場合は、オプションでインデックスも指定できます。以下の例では、table1はSeq Scan、table2は主キーインデックスでのIndex Scanを選択させています。
-<pre>
-postgres=# /*+
-postgres*#     SeqScan(t1)
-postgres*#     IndexScan(t2 t2_pkey)
-postgres*#  */
-postgres-# SELECT * FROM table1 t1 JOIN table table2 t2 ON (t1.key = t2.key);
-...
-</pre>
-</p>
-
-<h3>結合方式/結合順序</h3>
-<p>結合方式や結合順序のヒントでは、結合対象のテーブルのリストを指定します。以下の例では、table1とtabele2を直接結合する場合はNested Loopを、table1とtable2とtable3を結合する場合はMerge Joinを選択させています。また、コスト見積もりによってはtable1とtable2が直接結合されない場合がありえるため、table1とtable2を結合してからtable3を結合するようにLeadingヒントを併用しています。
-<pre>
-postgres=# /*+
-postgres*#     NestLoop(t1 t2)
-postgres*#     MergeJoin(t1 t2 t3)
-postgres*#     Leading(t1 t2 t3)
-postgres*#  */
-postgres-# SELECT * FROM table1 t1
-postgres-#     JOIN table table2 t2 ON (t1.key = t2.key)
-postgres-#     JOIN table table3 t3 ON (t2.key = t3.key);
-...
-</pre>
-</p>
-
-<h3>GUCパラメータ</h3>
-<p>
-GUCパラメータのヒントでは、GUCパラメータと値のペアを指定します。以下の例では、このクエリの実行計画を作成する間だけrandom_page_costを2.0に変更しています。
-<pre>
-postgres=# /*+
-postgres*#     Set(random_page_cost 2.0)
-postgres*#  */
-postgres-# SELECT * FROM table1 t1 WHERE key = 'value';
-...
-</pre>
-</p>
-
 <h2 id="restrictions">使用上の注意と制約</h2>
 <p>pg_hint_planを使用する際には、以下の注意と制約があります。</p>
 <h3>ヒントの指定方法</h3>
 <dl>
 <dt>コメント指定でのヒント記述位置</dt>
-<dd>ヒントはクエリの先頭または途中に記述できます。ただし、ヒントをクエリの途中に記述する場合、ヒント用のブロックコメントより前に以下の文字<span class="strong">以外</span>が含まれると、「/*+」で始まるコメントでもヒントとして扱われず無視されます。
+<dd>ヒントはクエリの先頭または途中に記述できます。ただし、ヒントをクエリの途中に記述する場合、ヒント用のブロックコメントより前に以下の文字<span class="strong">以外</span>が含まれると、「/*+」で始まるコメントでもヒントと見なされず無視されます。
 <ul>
 <li>空白文字(半角スペース、水平/垂直タブ、改行、フォームフィード、復帰)</li>
 <li>アルファベット(大文字/小文字)</li>
@@ -337,31 +351,35 @@ postgres-# SELECT * FROM table1 t1 WHERE key = 'value';
 <li>カンマ</li>
 <li>開き括弧(()、閉じ括弧())</li>
 </ul>
-指定したヒントが使用される記述例
+<p>指定したヒントが無視される例を以下に示します。</p>
+<ol>
+<li>二重引用符(")がヒント用のブロックコメントより前に含まれている場合</li>
 <pre>
-postgres=# WITH accounts_limit AS (
-postgres(#    SELECT aid, bid FROM pgbench_accounts a LIMIT 10
-postgres(#    )
+postgres=# SELECT bid AS "BID" 
 postgres-# /*+
-postgres*#    <span class="strong">SeqScan(a)</span>
+postgres*#     SeqScan(b)
 postgres*#  */
-postgres-# SELECT * FROM accounts_limit;
+postgres-#   FROM pgbench_branches b;
 ...
 </pre>
-指定したヒントが無視される記述例(ヒント用のブロックコメントより前に、二重引用符(")が含まれている。)
+<li>演算子(>=)がヒント用のブロックコメントより前に含まれている場合</li>
 <pre>
-postgres=# SELECT bid AS "BID" 
+postgres=# WITH avg_aid AS (
+postgres(#    SELECT avg(aid) FROM pgbench_history h
+postgres(#     WHERE delta >= 0
+postgres(# )
 postgres-# /*+
-postgres*#    <span class="strong">SeqScan(b)</span>
+postgres*#     SeqScan(h)
 postgres*#  */
-postgres-#    FROM pgbench_branches b;
+postgres-# SELECT * FROM avg_aid;
 ...
 </pre>
+</ol>
 一つのクエリに複数のブロックコメントを記述する場合は、最初のブロックコメントにのみヒントを記述してください。二番目以降のブロックコメントは、ヒントと見なされず無視されます。以下の例では、HashJoin(a b)とSeqScan(a)がヒントと見なされ、IndexScan(a)とMergeJoin(a b)は無視されています。</p>
 <pre>
 postgres=# /*+
-postgres*#    <span class="strong">HashJoin(a b)</span>
-postgres*#    <span class="strong">SeqScan(a)</span>
+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) */ *
@@ -400,9 +418,9 @@ postgres$# $$ LANGUAGE plpgsql;
 </pre>
 </dd>
 <dt>オブジェクト名の引用符付け</dt>
-<dd>ヒントに記述するオブジェクト名や別名が括弧((、)のいずれか)、二重引用符(")、空白(スペース、タブ、改行のいずれか)を含む場合は、通常のSQL文で使う場合と同じように二重引用符(")で囲んでください。二重引用符を含むオブジェクト名は、二重引用符で括ったうえで二重引用符を二重引用符でエスケープしてください(例: 「quoted"table"name」→「"quoted""table""name"」)。</dd>
+<dd>ヒントに記述するオブジェクト名や別名が括弧((、)のいずれか)、二重引用符(")、空白(スペース、タブ、改行のいずれか)を含む場合は、通常のSQL文で使う場合と同じように二重引用符(")で囲んでください。二重引用符を含むオブジェクト名は、全体を二重引用符で括ったうえで、内部に含む二重引用符を二重引用符でエスケープしてください(例: 「quoted"table"name」→「"quoted""table""name"」)。</dd>
 <dt>同一名称テーブルの区別</dt>
-<dd>スキーマ違いや同一テーブルの複数回使用などでクエリ中に同一名称のテーブルが複数回出現する場合は、テーブルに別名をつけてそれぞれのテーブルを区別してください。以下の例の1つ目のSQL文では、HashJoin(t1 t1)をヒントに指定したとき、ヒント対象のオブジェクトが特定できずにエラーになっています。2つ目のSQL文では、各テーブルにptやstという別名をつけているため、実行計画作成時にヒントで指定した通りにHash Joinを選択しています。</p>
+<dd>ã\82¹ã\82­ã\83¼ã\83\9eé\81\95ã\81\84ã\82\84å\90\8cä¸\80ã\83\86ã\83¼ã\83\96ã\83«ã\81®è¤\87æ\95°å\9b\9e使ç\94¨ã\81ªã\81©ã\81§ã\82¯ã\82¨ã\83ªä¸­ã\81«å\90\8cä¸\80å\90\8d称ã\81®ã\83\86ã\83¼ã\83\96ã\83«ã\81\8cè¤\87æ\95°å\9b\9eå\87ºç\8f¾ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\83\86ã\83¼ã\83\96ã\83«ã\81«å\88¥å\90\8dã\82\92ã\81¤ã\81\91ã\81¦ã\81\9dã\82\8cã\81\9eã\82\8cã\81®ã\83\86ã\83¼ã\83\96ã\83«ã\82\92å\8cºå\88¥ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82以ä¸\8bã\81®ä¾\8bã\81®1ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81§ã\81¯ã\80\81HashJoin(t1 t1)ã\82\92ã\83\92ã\83³ã\83\88ã\81«æ\8c\87å®\9aã\81\97ã\81\9fã\81¨ã\81\8dã\80\81ã\83\92ã\83³ã\83\88å\8f¥å¯¾è±¡ã\81®ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81\8cç\89¹å®\9aã\81§ã\81\8dã\81\9aã\81«ã\82¨ã\83©ã\83¼ã\81«ã\81ªã\81£ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82\81¤ç\9b®ã\81®SQLæ\96\87ã\81§ã\81¯ã\80\81å\90\84ã\83\86ã\83¼ã\83\96ã\83«ã\81«ptã\82\84stã\81¨ã\81\84ã\81\86å\88¥å\90\8dã\82\92ã\81¤ã\81\91ã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81å®\9fè¡\8cè¨\88ç\94»ä½\9cæ\88\90æ\99\82ã\81«ã\83\92ã\83³ã\83\88ã\81§æ\8c\87å®\9aã\81\97ã\81\9fé\80\9aã\82\8aã\81«Hash Joinã\82\92é\81¸æ\8a\9eã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82</p>
 <pre>
 postgres=# /*+ <span class="strong">HashJoin(t1 t1)</span>*/
 postgres-# EXPLAIN SELECT * FROM s1.t1
@@ -437,7 +455,7 @@ postgres=#</pre>
 </p>
 </dd>
 <dt>FROM句にVALUESコマンドを指定した場合の制限</dt>
-<dd>FROM句にVALUESコマンドを指定した場合は、ヒントのオブジェクト名に「*VALUES*」を指定してください。これは、VALUESの結果に別名を指定しても、PostgreSQL本体側で「*VALUES*」に名称が置き換えられるためです。このため、複数のVALUESを使用する場合は、ヒントの対象を特定できないため、実行計画を制御できません。
+<dd>FROM句にVALUESコマンドを指定した場合は、ヒント句のオブジェクト名に「*VALUES*」を指定してください。これは、VALUESの結果に別名を指定しても、PostgreSQL本体側で「*VALUES*」に名称が置き換えられるためです。複数のVALUESを使用する場合、この動作によりヒント句の対象を特定できません。よって、実行計画を制御できません。
 <pre>
 postgres=# /*+ <span class="strong">MergeJoin(a *VALUES*)</span> */
 postgres-# EXPLAIN SELECT *
@@ -461,9 +479,9 @@ postgres=#
 
 <h3>ヒントの適用対象の指定</h3>
 <dl>
-<dt>クエリに明記されていないテーブルへのヒント適用</dt>
-<dd>ヒントで指定した名称と一致すれば、ビュー定義や関数内クエリなどに出現するテーブルについても、ヒントを指定したクエリ内と同じようにヒントが適用されます。このため、ヒントの適用有無や適用するヒントをそれぞれのテーブルで変えたい場合は、別の別名を指定してください。</br>
-以下の例では、ビュー定義で使われている「t1」という別名をSeqScanヒントで指定したことで、表スキャンとビュー経由のスキャンの両方でSeq Scanが選択されています。ビュー定義で使用されている「t1」とは別の別名を実表に指定することで、個別にスキャン方式を制御できます。
+<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
@@ -491,22 +509,22 @@ postgres=# EXPLAIN SELECT * FROM table1 <span class="strong">t3</span> JOIN view
 
 </pre>
 </dd>
-<dt>継承テーブルに対するヒント</dt>
-<dd>継承テーブルにスキャン方式のヒントを指定する場合は、オブジェクト名として親テーブルの名称または別名を指定してください。全ての子テーブルに同じスキャン方式を選択します。子テーブルごとに別のスキャン方式を指定することはできません。</dd>
+<dt>継承テーブルに対するヒント</dt>
+<dd>継承テーブルにスキャン方式のヒントを指定する場合は、オブジェクト名として親テーブルの名称または別名を指定してください。全ての子テーブルに同じスキャン方式を選択します。子テーブルごとに別のスキャン方式を指定することはできません。</dd>
 <dt>ビューやルールを使うクエリのヒント</dt>
-<dd>ルールを定義したテーブルやビューを複数用いるときに、各ビュー内のテーブルの別名やルール書き換え後のクエリのテーブルの別名が重複した場合は、ヒントの対象を区別できません。区別する場合は、各ビュー内のテーブルの別名やルール書き換え後のクエリのテーブルの別名を重複させないでください。</dd>
+<dd>ルールを定義したテーブルやビューを複数用いるときに、各ビュー内のテーブルの別名やルール書き換え後のクエリのテーブルの別名が重複した場合は、ヒントの対象を区別できません。区別する場合は、各ビュー内のテーブルの別名やルール書き換え後のクエリのテーブルの別名を重複させないでください。</dd>
 <dt>ルールを使うクエリでのヒントの適用範囲</dt>
 <dd>ルールによるクエリ書き換えによってクエリが複数になる場合は、書き換え前のクエリで指定したヒントが全てのクエリで使用されます。ルール内のクエリにヒントを記述しても、そのヒントは適用されません。</dd>
 <dt>マルチステートメントでのヒントの適用範囲</dt>
-<dd>ã\82¯ã\82¨ã\83ªã\81\8cã\83\9eã\83«ã\83\81ã\82¹ã\83\86ã\83¼ã\83\88ã\83¡ã\83³ã\83\88ã\81§å®\9fè¡\8cã\81\95ã\82\8cã\82\8bå ´å\90\88ã\81¯ã\80\81\81¤ç\9b®ã\81®ã\82¯ã\82¨ã\83ªã\81§æ\8c\87å®\9aã\81\97ã\81\9fã\83\92ã\83³ã\83\88ã\82\92å\85¨ã\81¦ã\81®ã\82¯ã\82¨ã\83ªã\81§ä½¿ç\94¨ã\81\97ã\81¾ã\81\99ã\80\82\81¤ç\9b®ä»¥é\99\8dã\81®ã\82¯ã\82¨ã\83ªã\81«æ\8c\87å®\9aã\81\97ã\81\9fã\83\92ã\83³ã\83\88ã\81¯ç\84¡è¦\96ã\81\97ます。psqlコマンドで-cオプションで複数のクエリを指定した場合などにマルチステートメントで実行されます。</dd>
+<dd>ã\82¯ã\82¨ã\83ªã\82\92ã\83\9eã\83«ã\83\81ã\82¹ã\83\86ã\83¼ã\83\88ã\83¡ã\83³ã\83\88ã\81§å®\9fè¡\8cã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81\81¤ç\9b®ã\81®ã\82¯ã\82¨ã\83ªã\81§æ\8c\87å®\9aã\81\97ã\81\9fã\83\92ã\83³ã\83\88ã\81\8cå\85¨ã\81¦ã\81®ã\82¯ã\82¨ã\83ªã\81§ä½¿ç\94¨ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82\81¤ç\9b®ä»¥é\99\8dã\81®ã\82¯ã\82¨ã\83ªã\81«æ\8c\87å®\9aã\81\97ã\81\9fã\83\92ã\83³ã\83\88ã\81¯ç\84¡è¦\96ã\81\95ã\82\8cます。psqlコマンドで-cオプションで複数のクエリを指定した場合などにマルチステートメントで実行されます。</dd>
 <dt>副問い合わせ結果をヒントに指定する方法</dt>
-<dd>以下の副問い合わせの結果をヒントに指定する場合は、ヒントのオブジェクト名に「ANY_subquery」を指定してください。
+<dd>以下の副問い合わせの結果をヒントに指定する場合は、ヒントのオブジェクト名に「ANY_subquery」を指定してください。
 <ul>
 <li>IN (SELECT ... { LIMIT | OFFSET 等} ... )</li>
 <li>ANY (SELECT ... { LIMIT | OFFSET 等} ...)</li>
 <li>SOME (SELECT ... { LIMIT | OFFSET 等} ...)</li>
 </ul>
-PostgreSQLは、実行計画を生成するときに副問い合わせを上位の問合せに併合することがあります。しかし、上記のような副問い合わせの場合には併合せず、これらの副問い合わせの結果に内部的に「ANY_subquery」という固定名をつけます。以下の例では、その固定名を指定したヒントの効果でHash Joinが選択されています。
+PostgreSQLは、実行計画を生成するときに副問い合わせを上位の問合せに併合することがあります。しかし、上記のような副問い合わせの場合には併合せず、これらの副問い合わせの結果に内部的に「ANY_subquery」という固定名をつけます。以下の例では、その固定名を指定したヒント句の効果でHash Joinを選択しています。
 <pre>
 postgres=# /*+HashJoin(a1 ANY_subquery)*/
 postgres=# EXPLAIN SELECT *
@@ -525,52 +543,56 @@ postgres=#   WHERE aid IN (SELECT bid FROM pgbench_accounts a2 LIMIT 10);
 
 postgres=#
 </pre>
-一つのクエリで上記のような副問い合わせを複数使用している場合は、「ANY_subquery」と指定しても対象を特定できないため、ヒントはエラーとなり無視されます。</br>
+一つのクエリで上記のような副問い合わせを複数使用している場合は、「ANY_subquery」と指定しても対象を特定できないため、ヒントはエラーとなり無視されます。</br>
 </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>
+<dt>IndexOnlyScanヒントの指定(PostgreSQL 9.2以降)</dt>
+<dd>ヒント句の対象となるテーブルにIndex Only Scanが可能なインデックスとIndex Only Scanが不可能なインデックスが存在する場合、Index Only Scanが可能なインデックスをテーブルと併せてIndexOnlyScanヒント句に指定しないとIndex 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で指定したレベルでサーバログに記録されます。
+<dd>ヒント句の記述に構文上の誤りがあった場合、pg_hint_planは誤った記述より前のヒント句のみ有効とし、誤った記述以降のヒント句を無視してクエリを実行します。誤りの内容はpg_hint_plan.parse_messagesで指定したレベルでサーバログに記録されます。
 <ul>
-<li>ã\83\92ã\83³ã\83\88å\90\8dã\81\8c間違っている。</li>
-<li>ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88æ\8c\87å®\9aã\81\8cæ­£ã\81\97ã\81\8fæ\8b¬å¼§ã\81§å\9b²ã\81¾ã\82\8cていない。</li>
-<li>ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\90\8dã\81\8c空ç\99½ã\81§å\8cºå\88\87ã\82\89ã\82\8cていない。</li>
+<li>ã\83\92ã\83³ã\83\88å\8f¥å\90\8dã\82\92間違っている。</li>
+<li>ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88æ\8c\87å®\9aã\82\92æ­£ã\81\97ã\81\8fæ\8b¬å¼§ã\81§å\9b²ã\81£ていない。</li>
+<li>ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\90\8dã\82\92空ç\99½ã\81§å\8cºå\88\87ã\81£ていない。</li>
 </ul>
 </dd>
 <dt>オブジェクト指定エラー</dt>
-<dd>pg_hint_planã\81¯ã\80\81ã\83\92ã\83³ã\83\88対象ã\81®ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88æ\8c\87å®\9aã\81«èª¤ã\82\8aã\81\8cã\81\82ã\81£ã\81\9få ´å\90\88ã\80\81pg_hint_planã\81¯ä¸\8dæ­£ã\81ªã\83\92ã\83³ã\83\88ã\81®ã\81¿ã\82\92ç\84¡è¦\96ã\81\97ã\80\81ã\81\9dã\82\8c以å¤\96ã\81®ã\83\92ã\83³ã\83\88ã\82\92使ã\81£ã\81¦ã\81£ã\82¯ã\82¨ã\83ªã\82\92å®\9fè¡\8cã\81\97ã\81¾ã\81\99ã\80\82誤ã\82\8aã\81®å\86\85容ã\81¯pg_hint_plan.parse_messagesã\81§æ\8c\87å®\9aã\81\97ã\81\9fã\83¬ã\83\99ã\83«ã\81§ã\82µã\83¼ã\83\90ã\83­ã\82°ã\81«è¨\98é\8c²ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82誤ã\81£ã\81\9fã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88æ\8c\87å®\9aã\81®ä¾\8bã\82\92以ä¸\8bã\81«ç¤ºã\81\97ã\81¾ã\81\99ã\80\82</dd>
+<dd>pg_hint_planã\81¯ã\80\81ã\83\92ã\83³ã\83\88å\8f¥å¯¾è±¡ã\81®ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88æ\8c\87å®\9aã\81«èª¤ã\82\8aã\81\8cã\81\82ã\81£ã\81\9få ´å\90\88ã\80\81pg_hint_planã\81¯ä¸\8dæ­£ã\81ªã\83\92ã\83³ã\83\88å\8f¥ã\81®ã\81¿ã\82\92ç\84¡è¦\96ã\81\97ã\80\81ã\81\9dã\82\8c以å¤\96ã\81®ã\83\92ã\83³ã\83\88å\8f¥ã\82\92使ã\81£ã\81¦ã\82¯ã\82¨ã\83ªã\82\92å®\9fè¡\8cã\81\97ã\81¾ã\81\99ã\80\82誤ã\82\8aã\81®å\86\85容ã\81¯pg_hint_plan.parse_messagesã\81§æ\8c\87å®\9aã\81\97ã\81\9fã\83¬ã\83\99ã\83«ã\81§ã\82µã\83¼ã\83\90ã\83­ã\82°ã\81«è¨\98é\8c²ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82誤ã\81£ã\81\9fã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88æ\8c\87å®\9aã\81®ä¾\8bã\82\92以ä¸\8bã\81«ç¤ºã\81\97ã\81¾ã\81\99ã\80\82
 <ul>
-<li>クエリ中に同じ名称のテーブル名または別名のテーブルがあり、それに対してヒントを指定した。</li>
-<li>結合方式や結合順のヒントに同じオブジェクト名を複数回指定した。</li>
+<li>クエリ中に同じ名称のテーブル名または別名のテーブルがあり、それに対してヒントを指定した。</li>
+<li>結合方式や結合順序のヒント句に同じオブジェクト名を複数回指定した。</li>
 </ul>
 </dd>
-<dt>指定するヒントの種類の重複</dt>
-<dd>同じオブジェクトに対して同じグループのヒントを重複して指定した場合は、各グループで最後に指定したヒントを使用します。</dd>
+<div class="tips">
+<span class="strong">構文エラーとオブジェクト指定エラーが同時に起こった場合</span>
+<p>構文エラーより前のヒント句を有効とし、そのうちでオブジェクト指定エラーでないヒント句を使いクエリを実行します。</p>
+</div><br>
+<dt>指定するヒント句の種類の重複</dt>
+<dd>同じオブジェクトに対して同じグループのヒント句を重複して指定した場合は、各グループで最後に指定したヒント句を使用します。</dd>
 <dt>ネストしたブロックコメント</dt>
-<dd>pg_hint_planでは、ヒントを指定したブロックコメントにネストしたブロックコメントを含めることができません。ネストしたブロックコメントを含めた場合は、誤った記述に関する情報を出力しますがエラー終了しません。全てのヒントを無視してクエリを実行します。</dd>
+<dd>pg_hint_planでは、ヒントを指定したブロックコメントにネストしたブロックコメントを含めることができません。ネストしたブロックコメントを含めた場合は、誤った記述に関する情報を出力しますがエラー終了しません。ヒントを無視してクエリを実行します。</dd>
 <dt>メッセージの出力レベル</dt>
-<dd>ヒントに誤りがあった場合に出力されるメッセージのレベルは、基本的にはpg_hint_plan.parse_messagesに指定したレベルです。ただし、ヒントに指定したオブジェクトの長さが識別子の最大長(デフォルトでは63バイト)を超えた際に切り詰めた場合は、NOTICEで出力します。</dd>
+<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のプランナが候補としてあげる事ができない実行計画の例を以下に示します。
+<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å\8f¥ã\82\84JOINæ\9d¡ä»¶ã\81ªã\81©ã\81«æ\8c\87å®\9aã\81\95ã\82\8cã\81ªã\81\84å\88\97ã\81®ã\81¿ã\82\92å\90«ã\82\80ã\82¤ã\83³ã\83\87ã\83\83ã\82¯ã\82¹ã\81¯å\80\99è£\9cã\83\91ã\82¹ã\81¨ã\81\97ã\81¦æ\89±ã\82\8fã\82\8cません。</li>
-<li>検索条件にctidを指定しない場合はTid Scanは候補パスとして扱われません。</li>
+<li>FULL OUTER JOINではNested Loopは、プランナが実行計画の候補として扱いません。</li>
+<li>WHEREå\8f¥ã\82\84JOINæ\9d¡ä»¶ã\81ªã\81©ã\81«æ\8c\87å®\9aã\81\97ã\81¦ã\81\84ã\81ªã\81\84å\88\97ã\81®ã\81¿ã\82\92å\90«ã\82\80ã\82¤ã\83³ã\83\87ã\83\83ã\82¯ã\82¹ã\81¯ã\80\81ã\83\97ã\83©ã\83³ã\83\8aã\81\8cå®\9fè¡\8cè¨\88ç\94»ã\81®å\80\99è£\9cã\81¨ã\81\97ã\81¦æ\89±ã\81\84ません。</li>
+<li>検索条件にctidを指定しない場合はTid Scanは、プランナが実行計画の候補として扱いません。</li>
 </ul>
 </dd>
 <dt>ECPGにおける制限</dt>
-<dd>pg_hint_planでは、ECPGで実装したアプリケーションから発行するクエリは、基本的に実行計画を制御できません。これは、CプリプロセッサがCコードに変換するタイミングで、全てのブロックコメントを取り除いてしまうためです。ただし、C言語文字列に格納したクエリをEXECUTEコマンドで実行する動的SQLの場合は、クエリ文字列にヒントを指定することで実行計画を制御できます。</dd>
+<dd>ECPGで実装したアプリケーションから発行するクエリにヒントをコメントで指定した場合、実行計画を制御できません。これは、CプリプロセッサがCコードに変換するタイミングで、全てのブロックコメントを取り除いてしまうためです。ただし、C言語文字列に格納したクエリをEXECUTEコマンドで実行する動的SQLの場合は、コメントでヒントを指定しても実行計画を制御できます。</dd>
 <dt>ヒントによるフィンガープリントの変化</dt>
-<dd>SQLコメントでヒントを指定した場合、SQL文フィンガープリントベースのクエリキャッシュなどでは、ヒントが異なれば別のSQL文として扱われます。pg_stat_statementも9.1では別クエリとして集計しますが、9.2ではクエリ集約機能によりコメントが除去されるので、ヒントのみが異なるクエリは同じクエリとして扱われます。</dd>
+<dd>SQLã\82³ã\83¡ã\83³ã\83\88ã\81§ã\83\92ã\83³ã\83\88ã\82\92æ\8c\87å®\9aã\81\97ã\81\9få ´å\90\88ã\80\81SQLæ\96\87ã\83\95ã\82£ã\83³ã\82¬ã\83¼ã\83\97ã\83ªã\83³ã\83\88ã\83\99ã\83¼ã\82¹ã\81®ã\82¯ã\82¨ã\83ªã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81ªã\81©ã\81§ã\81¯ã\80\81ã\83\92ã\83³ã\83\88ã\81\8cç\95°ã\81ªã\82\8cã\81°å\88¥ã\81®SQLæ\96\87ã\81¨ã\81\97ã\81¦æ\89±ã\82\8fã\82\8cã\81¾ã\81\99ã\80\82pg_stat_statementã\82\829.1ã\81§ã\81¯å\88¥ã\82¯ã\82¨ã\83ªã\81¨ã\81\97ã\81¦é\9b\86è¨\88ã\81\97ã\81¾ã\81\99ã\81\8cã\80\819.2ã\81§ã\81¯ã\82¯ã\82¨ã\83ªé\9b\86ç´\84æ©\9fè\83½ã\81«ã\82\88ã\82\8aã\82³ã\83¡ã\83³ã\83\88ã\81\8cé\99¤å\8e»ã\81\95ã\82\8cã\82\8bã\81®ã\81§ã\80\81ã\82³ã\83¡ã\83³ã\83\88ã\81§æ\8c\87å®\9aã\81\97ã\81\9fã\83\92ã\83³ã\83\88ã\81®ã\81¿ã\81\8cç\95°ã\81ªã\82\8bã\82¯ã\82¨ã\83ªã\81¯å\90\8cã\81\98ã\82¯ã\82¨ã\83ªã\81¨ã\81\97ã\81¦æ\89±ã\82\8fã\82\8cã\81¾ã\81\99ã\80\82</dd>
 
 </dl>