<tr><td>TidScan(テーブル)</td>\r
<td>ctidに具体的な値を指定したときに、指定したテーブルについて、Tid Scanを選択します。</td></tr>\r
<tr><td>IndexScan(テーブル[ インデックス[ インデックス...]])</td>\r
- <td>指定したテーブルについて、IndexScanを選択します。インデックスも指定した場合は、指定したインデックスの中でコストが最小となるIndex Scanを選択します。ただし、インデックスが存在しない場合や指定したインデックスがWHERE句やJOIN条件などに関連しない場合はSeq Scanを選択します。</td></tr>\r
+ <td>指定したテーブルについて、Index Scanを選択します。インデックスも指定した場合は、指定したインデックスの中でコストが最小となるIndex Scanを選択します。ただし、インデックスが存在しない場合や指定したインデックスがWHERE句やJOIN条件などに関連しない場合はSeq Scanを選択します。</td></tr>\r
<tr><td>BitmapScan(テーブル[ インデックス[ インデックス...]])</td>\r
<td>指定したテーブルについて、Bitmap Scanを選択します。</br>インデックスも指定した場合は、指定したインデックスの中でコストが最小となるインデックスを選択します。ただし、インデックスが存在しない場合や指定したインデックスがWHERE句やJOIN条件などに関連しない場合はSeq Scanを選択します。</td></tr>\r
<tr><td>NoSeqScan(テーブル)</td>\r
<td>指定したテーブルについて、Seq Scan以外でコストが最小となるスキャン方式を選択します。ただし、他のスキャン方式を選択できない場合は、Seq Scanを選択します。</td></tr>\r
<tr><td>NoTidScan(テーブル)</td>\r
- <td>指定したテーブルについて、Tid Scanを除いたコストが最小となるスキャン方式を選択します。</td></tr>\r
+ <td>指定したテーブルについて、Tid Scan以外でコストが最小となるスキャン方式を選択します。</td></tr>\r
<tr><td>NoIndexScan(テーブル)</td>\r
- <td>指定したテーブルについて、Bitmap Scanを除いたコストが最小となるスキャン方式を選択します。</td></tr>\r
+ <td>指定したテーブルについて、Index Scan以外でコストが最小となるスキャン方式を選択します。</td></tr>\r
<tr><td>NoBitmapScan(テーブル)</td>\r
- <td>指定したテーブルについて、Bitmap Scanを除いたコストが最小となるスキャン方式を選択します。</td></tr>\r
+ <td>指定したテーブルについて、Bitmap Scan以外でコストが最小となるスキャン方式を選択します。</td></tr>\r
\r
<tr><td rowspan="6" nowrap>結合方式</td>\r
<td>NestLoop(テーブル テーブル[ テーブル...])</td>\r
<li><a href="#hint-load">pg_hint_planのロード</a></li>
<li><a href="#hint-rule">ヒントの記述方法</a></li>
<li><a href="#hint-object">対象オブジェクトの指定方法</a></li>
- <li><a href="#hint-type">ヒントの種類</a></li>
+ <li><a href="#hint-type">ヒントのグループ</a></li>
<li><a href="#hint-GUC">pg_hint_planのGUCパラメータ</a></li>
</ol>
</li>
postgres=# </pre>
<h3 id="hint-object">対象オブジェクトの指定方法</h3>
-<p>ã\83\92ã\83³ã\83\88ã\81®å¯¾è±¡ã\81¨ã\81ªã\82\8bã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81¯ã\80\81ã\83\86ã\83¼ã\83\96ã\83«ã\81¨ã\82¤ã\83³ã\83\87ã\83\83ã\82¯ã\82¹ã\81®2種é¡\9eã\81§ã\81\99ã\80\82ã\83\86ã\83¼ã\83\96ã\83«ã\81¨ã\82¤ã\83³ã\83\87ã\83\83ã\82¯ã\82¹ã\81®ã\81©ã\81¡ã\82\89ã\81®å ´å\90\88ã\81§ã\82\82ã\82¹ã\82ã\83¼ã\83\9e修飾ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82ã\81¾ã\81\9fã\80\81ã\81©ã\81¡ã\82\89ã\81®å ´å\90\88ã\81§ã\82\82ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\90\8dã\81®å¤§æ\96\87å\97ã\81¨å°\8fæ\96\87å\97ã\82\92å\8cºå\88¥ã\81\97ã\81¾ã\81\99。</br>
-ã\83\86ã\83¼ã\83\96ã\83«ã\82\92対象ã\81«ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\83\86ã\83¼ã\83\96ã\83«å\90\8dã\81¾ã\81\9fã\81¯å\88¥å\90\8d(ã\82¨ã\82¤ã\83ªã\82¢ã\82¹)ã\81§æ\8c\87å®\9aã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99。
+<p>ã\83\92ã\83³ã\83\88ã\81®å¯¾è±¡ã\81¨ã\81ªã\82\8bã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81¯ã\80\81ã\83\86ã\83¼ã\83\96ã\83«ã\81¨ã\83\93ã\83¥ã\83¼ã\81¨ã\82¤ã\83³ã\83\87ã\83\83ã\82¯ã\82¹ã\81®3種é¡\9eã\81§ã\81\99ã\80\823種é¡\9eã\81®ã\81©ã\81®å ´å\90\88ã\81§ã\82\82ã\82¹ã\82ã\83¼ã\83\9e修飾ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82ã\81¾ã\81\9fã\80\81ã\81©ã\81®å ´å\90\88ã\81§ã\82\82ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\90\8dã\81«å°\8fæ\96\87å\97ã\81¨ã\82¢ã\83³ã\83\80ã\83¼ã\82¹ã\82³ã\82¢(_)以å¤\96ã\81®æ\96\87å\97(大æ\96\87å\97ã\80\81æ\95°å\97ã\80\81空ç\99½ã\82¹ã\83\9aã\83¼ã\82¹ã\81ªã\81©)ã\82\92å\90«ã\82\80å ´å\90\88ã\81¯ã\80\81ã\83\80ã\83\96ã\83«ã\82¯ã\82©ã\83¼ã\83\88(")ã\81§å\9b²ã\82\93ã\81§ã\81\8fã\81 ã\81\95ã\81\84。</br>
+ã\83\86ã\83¼ã\83\96ã\83«ã\82\92対象ã\81«ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\83\86ã\83¼ã\83\96ã\83«å\90\8dã\81¾ã\81\9fã\81¯å\88¥å\90\8d(ã\82¨ã\82¤ã\83ªã\82¢ã\82¹)ã\81§æ\8c\87å®\9aã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。
ただし、スキーマが異なる同じ名前のテーブルを1クエリ中に用いる場合は、別名で指定してください。個々のテーブルを指定できるようにするためです。</p>
<p>以下に示した具体例について説明します。</br>
1つ目のSQL文では、MergeJoin(t1 t1)をヒントに指定したとき、ヒント対象のオブジェクト指定に失敗しています。これは、t1というテーブル名が2つ存在するために、テーブルを区別できなかったことが原因です。</br>
-2つ目のSQL文では、各テーブルにptやstという別名をつけているため、ヒントで指定したの通りにMerge Joinしています。
+2つ目のSQL文では、各テーブルにptやstという別名をつけているため、実行計画作成時にヒントで指定した通りにMerge Joinを選択しています。
</p>
<pre>
postgres=# /* <strong>MergeJoin(t1 t1)</strong>*/
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)"
-DETAIL: relation name "t1" is ambiguous
+<strong>DETAIL: relation name "t1" is ambiguous</strong>
INFO: hint syntax error at or near "t1 t1)"
-DETAIL: relation name "t1" is ambiguous
+<strong>DETAIL: relation name "t1" is ambiguous</strong>
QUERY PLAN
--------------------------------------------------------------------
- <strong>Hash Join</strong> (cost=270.00..323.05 rows=1230 width=44)
+ 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)
-> Index Scan using t1_pkey on t1 pt (cost=0.00..318.25 rows=10000 width=8)(4 rows)
postgres=#</pre>
+<p>ビューを対象とする場合は、テーブルを対象とする場合に加えて制限事項が存在します。<a href="#view_limit">ビューに対する制限</a>を参照してください</p>
<p>インデックスを対象にする場合は、インデックス名で指定してください。なお、インデックス名のみを対象とするヒントはありません。</p>
-<p>以下に具体例を示します。IndexScanヒントに対してt1テーブルの他にt1_valインデックスを指定することで、t1_valインデックスを用いてIndex Scanしています。</p>
+<p>以下に示した具体例について説明します。</br>この例では、IndexScanヒントに対してt1テーブルの他にt1_valインデックスを指定したため、実行計画作成時にt1_valインデックスを用いたIndex Scanを選択しています。</p>
<pre>
-postgres=# /* IndexScan(t1 <strong>t1_val</strong>) */
+postgres=# /* <strong>IndexScan</strong>(t1 <strong>t1_val</strong>) */
postgres-# EXPLAIN SELECT * FROM t1
postgres-# WHERE id < 5
postgres-# AND val < 3;
QUERY PLAN
-------------------------------------------------------------------
- Index Scan using <strong>t1_val</strong> on t1 (cost=0.00..190.19 rows=1 width=8)
+ <strong>Index Scan</strong> using <strong>t1_val</strong> on t1 (cost=0.00..190.19 rows=1 width=8)
Index Cond: (val < 3)
Filter: (id < 5)
(3 rows)
特定のテーブルに対するスキャン方式を選択したい場合は、そのスキャン方式のヒントと、対象となるオブジェクトの名前を指定してください。
特定のテーブルに対するスキャン方式を選択してほしくない場合は、そのスキャン方式のヒントの先頭に No を記述した上で、対象となるオブジェクトの名前を指定してください。</p>
<p>以下に示した具体例について説明します。</br>
-1ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81§ã\81¯ã\80\81aã\83\86ã\83¼ã\83\96ã\83«ã\81«Index Scanã\82\92é\81¸æ\8a\9eã\81\95ã\81\9bã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81¦å®\9fè¡\8cè¨\88ç\94»ã\82\92å\8f\96å¾\97しています。</br>
-2ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81§ã\81¯ã\80\81aã\83\86ã\83¼ã\83\96ã\83«ã\81«Index Scan以å¤\96ã\82\92é\81¸æ\8a\9eã\81\95ã\81\9bã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81¦å®\9fè¡\8cè¨\88ç\94»ã\82\92å\8f\96å¾\97しています。</p>
+1ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81§ã\81¯ã\80\81aã\83\86ã\83¼ã\83\96ã\83«ã\81«Index Scanã\82\92é\81¸æ\8a\9eã\81\95ã\81\9bã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81\9fã\81\9fã\82\81ã\80\81å®\9fè¡\8cè¨\88ç\94»ä½\9cæ\88\90æ\99\82ã\81«aã\83\86ã\83¼ã\83\96ã\83«ã\81«å¯¾ã\81\97ã\81¦Index Scanã\82\92é\81¸æ\8a\9eしています。</br>
+2ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81§ã\81¯ã\80\81aã\83\86ã\83¼ã\83\96ã\83«ã\81«Index Scan以å¤\96ã\82\92é\81¸æ\8a\9eã\81\95ã\81\9bã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81\9fã\81\9fã\82\81ã\80\81å®\9fè¡\8cè¨\88ç\94»ä½\9cæ\88\90æ\99\82ã\81«aã\83\86ã\83¼ã\83\96ã\83«ã\81«å¯¾ã\81\97ã\81¦Index Scan以å¤\96ã\81®ã\82¹ã\82ã\83£ã\83³æ\96¹å¼\8fã\81§ã\81\82ã\82\8bSeq Scanã\82\92é\81¸æ\8a\9eしています。</p>
<pre>postgres=# /* <strong>IndexScan(a)</strong> */
postgres-# EXPLAIN SELECT *
postgres-# FROM pgbench_accounts a
特定の結合方式を選択したい場合は、その結合方式のヒントと、対象となる2つ以上のオブジェクトの名前を指定してください。
特定の結合方式を選択してほしくない場合は、その結合方式のヒントの先頭に No を記述した上で、対象となるオブジェクトの名前を指定してください。</p>
<p>以下に示した具体例について説明します。</br>
-1ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81§ã\81¯ã\80\81aã\83\86ã\83¼ã\83\96ã\83«ã\81¨bã\83\86ã\83¼ã\83\96ã\83«ã\81®çµ\90å\90\88ã\81«Merge Joinã\82\92é\81¸æ\8a\9eã\81\95ã\81\9bã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81¦å®\9fè¡\8cè¨\88ç\94»ã\82\92å\8f\96å¾\97しています。</br>
-2ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81§ã\81¯ã\80\81aã\83\86ã\83¼ã\83\96ã\83«ã\81¨bã\83\86ã\83¼ã\83\96ã\83«ã\81®çµ\90å\90\88ã\81«Merge Join以å¤\96ã\82\92é\81¸æ\8a\9eã\81\95ã\81\9bã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81¦å®\9fè¡\8cè¨\88ç\94»ã\82\92å\8f\96å¾\97しています。</p>
+1ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81§ã\81¯ã\80\81aã\83\86ã\83¼ã\83\96ã\83«ã\81¨bã\83\86ã\83¼ã\83\96ã\83«ã\81®çµ\90å\90\88ã\81«Merge Joinã\82\92é\81¸æ\8a\9eã\81\95ã\81\9bã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81\9fã\81\9fã\82\81ã\80\81å®\9fè¡\8cè¨\88ç\94»ä½\9cæ\88\90æ\99\82ã\81«Merge Joinã\82\92é\81¸æ\8a\9eしています。</br>
+2ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81§ã\81¯ã\80\81aã\83\86ã\83¼ã\83\96ã\83«ã\81¨bã\83\86ã\83¼ã\83\96ã\83«ã\81®çµ\90å\90\88ã\81«Merge Join以å¤\96ã\82\92é\81¸æ\8a\9eã\81\95ã\81\9bã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81\9fã\81\9fã\82\81ã\80\81å®\9fè¡\8cè¨\88ç\94»ä½\9cæ\88\90æ\99\82ã\81«Merge Join以å¤\96ã\81®çµ\90å\90\88æ\96¹å¼\8fã\81§ã\81\82ã\82\8bNested Loopã\82\92é\81¸æ\8a\9eしています。</p>
<pre>
postgres=# /*
postgres*# <strong>MergeJoin(b a)</strong>
<p>テーブルの結合に対して、どんな順番で結合するか指定できるヒントのグループのことです。
結合の順番を指定したい場合は、結合順序のヒント(Leading)と、2つ以上のオブジェクトの名前を結合したい順番で指定してください。</p>
<p>以下に示した具体例について説明します。</br>
-ã\81\93ã\81®ä¾\8bã\81§ã\81¯ã\80\81bã\83\86ã\83¼ã\83\96ã\83«ã\81¨aã\83\86ã\83¼ã\83\96ã\83«ã\82\92çµ\90å\90\88ã\81\95ã\81\9bã\81\9få¾\8cã\80\81ã\81\93ã\81®çµ\90å\90\88ã\83\86ã\83¼ã\83\96ã\83«ã\81¨tã\83\86ã\83¼ã\83\96ã\83«ã\82\92çµ\90å\90\88ã\81\95ã\81\9bã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81¦å®\9fè¡\8cè¨\88ç\94»ã\82\92å\8f\96å¾\97しています。</p>
+ã\81\93ã\81®ä¾\8bã\81§ã\81¯ã\80\81bã\83\86ã\83¼ã\83\96ã\83«ã\81¨aã\83\86ã\83¼ã\83\96ã\83«ã\82\92çµ\90å\90\88ã\81\95ã\81\9bã\81\9få¾\8cã\80\81ã\81\93ã\81®çµ\90å\90\88ã\83\86ã\83¼ã\83\96ã\83«ã\81¨tã\83\86ã\83¼ã\83\96ã\83«ã\82\92çµ\90å\90\88ã\81\95ã\81\9bã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81\9fã\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ã\83\86ã\83¼ã\83\96ã\83«é \86ã\81§ã\83\86ã\83¼ã\83\96ã\83«çµ\90å\90\88ã\82\92é\81¸æ\8a\9eしています。</p>
<pre>postgres=# /*
postgres*# <strong>Leading(b a t)</strong>
postgres*# */
<p>1クエリ限りでGUCパラメータを設定できるヒントのグループのことです。
1クエリ限りでGUCパラメータを設定したい場合は、GUCパラメータを設定するためのヒント(Set)と、設定したいGUCパラメータとそのパラメータの値を指定してください。ただし、指定する値に小文字とアンダースコア(_)以外の文字(大文字、数字、空白スペースなど)を含む場合はダブルクォート(")で囲んでください。</p>
<p>以下に示した具体例について説明します。</br>
-1ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81¯ã\80\81GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®enable_hashjoinã\81¨enable_nestloopã\82\92offã\81«è¨å®\9aã\81\99ã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81¦å®\9fè¡\8cè¨\88ç\94»ã\82\92å\8f\96å¾\97しています。</br>
-2ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81¯ã\80\81GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®join_collapse_limitã\82\921ã\81«è¨å®\9aã\81\99ã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81¦å®\9fè¡\8cè¨\88ç\94»ã\82\92å\8f\96å¾\97しています。</p>
+1ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81¯ã\80\81GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®enable_hashjoinã\81¨enable_nestloopã\82\92offã\81«è¨å®\9aã\81\99ã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81\9fã\81\9fã\82\81ã\80\81å®\9fè¡\8cè¨\88ç\94»ä½\9cæ\88\90æ\99\82ã\81«å\90\84ã\83\86ã\83¼ã\83\96ã\83«é\96\93ã\81®çµ\90å\90\88ã\81§Merge Joinã\82\92é\81¸æ\8a\9eしています。</br>
+2ã\81¤ç\9b®ã\81®SQLæ\96\87ã\81¯ã\80\81GUCã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\81®join_collapse_limitã\82\921ã\81«è¨å®\9aã\81\99ã\82\8bã\83\92ã\83³ã\83\88ã\82\92ç\94¨ã\81\84ã\81\9fã\81\9fã\82\81ã\80\81å®\9fè¡\8cè¨\88ç\94»ä½\9cæ\88\90æ\99\82ã\81«FROMå\8f¥ã\81§æ\8c\87å®\9aã\81\97ã\81\9fã\83\86ã\83¼ã\83\96ã\83«é \86ã\81§ã\83\86ã\83¼ã\83\96ã\83«çµ\90å\90\88ã\82\92é\81¸æ\8a\9eしています。</p>
<pre>postgres=# /*
postgres*# Set(enable_hashjoin off)
postgres*# Set(enable_nestloop off)
<dd>pg_hint_planでは、ヒントの記述に誤りがあった場合は、誤った記述に関する情報を出力しますがエラー終了しません。誤った記述より前のヒントのみ有効となり、誤った記述以降のヒントを無視してクエリを実行します。</dd>
<dt>指定するヒントの種類の重複</dt>
<dd>同じオブジェクトに対して同じグループのヒントを重複して指定した場合は、最後に指定したヒントを使用します。</dd>
+<dt>ビューに対する制限</dt>
+<dd>ビューを複数用いるときに、各ビュー内のテーブルの別名が重複した場合は、ヒントの対象を区別できません。区別する場合は、各ビュー内のテーブルの別名を重複させないでください。</dd>
</dl>
<h2 id="known-issues">既知の問題</h2>
<p>pg_hint_planに関する既知の問題について説明します。</p>
<dl>
<dt>副問い合わせを含むSELECT文</dt>
-<dd>pg_hint_planの使用中に副問い合わせを含むSELECT文を実行すると、サーバ側で異常終了する場合があります。ですので、pg_hint_planを試用しているときは、副問い合わせを含むSELECT文を実行しないでください。</dd>
+<dd id="view_limit">pg_hint_planの使用中に副問い合わせを含むSELECT文を実行すると、サーバ側で異常終了する場合があります。よって、pg_hint_planを試用しているときは、副問い合わせを含むSELECT文を実行しないでください。</dd>
</dl>
<h2 id="seealso">関連項目</h2>