# pg_hint_plan 1.3 付録

## Appendix A. ヒント句一覧

pg_hint_planで指定できるヒント句は以下の通りです。

グループ | ヒント句の書式 | 説明
--- | --- | ---
スキャン方式 | SeqScan(テーブル) | 指定したテーブルについて、Seq Scanを選択します。
TidScan(テーブル) | 指定したテーブルについて、Tid Scanを選択します。検索条件にctidを指定した場合にのみ有効です。
IndexScan(テーブル[ インデックス...]) | 指定したテーブルについて、Index Scanを選択します。インデックスも指定した場合は、指定したインデックスの中でコストが最小となるIndex Scanを選択します。ただし、インデックスが存在しない場合や指定したインデックスがWHERE句やJOIN条件などに関連しない場合はSeq Scanを選択します。 継承関係の親テーブルとそのテーブルのインデックスを指定した場合は、子テーブルに対してそのインデックスと同様の定義のインデックスを選択します。
IndexOnlyScan(テーブル[ インデックス...]) | 指定したテーブルについて、Index Only ScanとIndex Scanのうちコストが最小となるスキャン方式を選択します。インデックスも指定した場合は、指定したインデックスの中でIndex Only ScanとIndex Scanのうちコストが最小となるスキャン方式を選択します。ただし、インデックスが存在しない場合や指定したインデックスがWHERE句やJOIN条件などに関連しない場合はSeq Scanを選択します。また、これらの場合以外にも、インデックスが持つ値だけでなくテーブルの値も必要な場合はIndex Scanを選択します。 継承関係の親テーブルとそのテーブルのインデックスを指定した場合は、子テーブルに対してそのインデックスと同様の定義のインデックスを選択します。 PostgreSQL 9.2以降で動作します。
BitmapScan(テーブル[ インデックス...]) | 指定したテーブルについて、Bitmap Scanを選択します。インデックスも指定した場合は、指定したインデックスの中でコストが最小となるインデックスを選択します。ただし、インデックスが存在しない場合や指定したインデックスがWHERE句やJOIN条件などに関連しない場合はSeq Scanを選択します。 継承関係の親テーブルとそのテーブルのインデックスを指定した場合は、子テーブルに対してそのインデックスと同様の定義のインデックスを選択します。
IndexScanRegexp(テーブル[ POSIX正規表現...])IndexOnlyScanRegexp(テーブル[ POSIX正規表現...])BitmapScanRegexp(テーブル[ POSIX正規表現...]) | テーブルのみを指定した場合のスキャン方式の選択基準は、Regexpの付かないスキャン方式のヒントと同じです。POSIX正規表現も指定した場合は、指定したPOSIX正規表現パターンに一致するインデックスの中でコストが最小となるスキャン方式を選択します。指定したテーブルが継承テーブルの場合は、子テーブルについても同じ基準で、使用するインデックスとスキャン方式を選択します。IndexOnlyScanRegexpヒントはPostgreSQL 9.2以降で動作します。
NoSeqScan(テーブル) | 指定したテーブルについて、Seq Scan以外でコストが最小となるスキャン方式を選択します。ただし、他のスキャン方式を選択できない場合は、Seq Scanを選択します。
NoTidScan(テーブル) | 指定したテーブルについて、Tid Scan以外でコストが最小となるスキャン方式を選択します。
NoIndexScan(テーブル) | 指定したテーブルについて、Index ScanとIndex Only Scanを除いたスキャン方式の中でコストが最小となるスキャン方式を選択します。
NoIndexOnlyScan(テーブル) | 指定したテーブルについて、Index Only Scan以外でコストが最小となるスキャン方式を選択します。PostgreSQL 9.2以降で動作します。
NoBitmapScan(テーブル) | 指定したテーブルについて、Bitmap Scan以外でコストが最小となるスキャン方式を選択します。
結合方式 | NestLoop(テーブル テーブル[ テーブル...]) | 指定したテーブル間の結合にNested Loopを選択します。
HashJoin(テーブル テーブル[ テーブル...]) | 指定したテーブル間の結合にHash Joinを選択します。
MergeJoin(テーブル テーブル[ テーブル...]) | 指定したテーブル間の結合にMerge Joinを選択します。
NoNestLoop(テーブル テーブル[ テーブル...]) | 指定したテーブル間の結合にNested Loop以外の結合方式を選択します。
NoHashJoin(テーブル テーブル[ テーブル...]) | 指定したテーブル間の結合にHash Join以外の結合方式を選択します。
NoMergeJoin(テーブル テーブル[ テーブル...]) | 指定したテーブル間の結合にMerge Join以外の結合方式を選択します。
結合順序 | Leading(テーブル テーブル[ テーブル...]) | 指定したテーブルを指定した順番通りに結合します。
Leading((テーブル集合注1 テーブル集合注1)) | 1つ目に指定したテーブル集合を外部表として、2つ目に指定したテーブル集合を内部表として結合します。書式中のテーブル集合はテーブルもしくは別のテーブル集合です。
見積もり件数補正 | Rows(テーブル テーブル[ テーブル...] 件数補正) | 指定したテーブル間の結合結果の見積もり件数を補正します。件数補正として指定できるのは以下の4パターンです。 #件数 指定した件数で本来の見積もり件を上書きします。 +件数 指定した件数を本来の見積もり件数に加算します。 -件数 指定した件数を本来の見積もり件数から減算します。 *倍率 本来の見積もり件数を指定した倍率に補正します。「*2」とすると見積もり件数が2倍になり、「*0.01」とすると見積もり件数が1/100になります。 なお、件数や倍率には、strtod()が解釈できる書式で数値を指定してください。
パラレル実行の制御 | Parallel(テーブル ワーカ数 [強制度]) | パラレル実行を強制あるいは禁止します。ワーカ数が0の場合はパラレル実行を禁止します。強制度はワーカ数の適用方法を指定するもので "hard" または "soft" を指定します。デフォルト値である"soft"の場合は max_parallel_workers_per_gather のみを変更してあとはプランナに任せます。そして"hard" の場合は指定したワーカ数を強制します。
GUCパラメータ | Set(GUCパラメータ 値) | そのクエリの実行計画を作成している間だけ、指定したGUCパラメータを指定した値に変更します。

注1テーブル集合とは、以下のような記述を指しています。
  テーブル集合 = {テーブル|(テーブル集合 テーブル集合)}