• R/O
  • HTTP
  • SSH
  • HTTPS

pg_hint_plan: Commit

firtst release


Commit MetaInfo

Revisionfd8affb6b71d00243c126e566d4ac7e34b13e8f3 (tree)
Time2014-09-18 14:26:43
AuthorKyotaro Horiguchi <horiguchi.kyotaro@lab....>
CommiterKyotaro Horiguchi

Log Message

Add new join method hint "NestLoop_NM" which means force nested loop
but inhibit materialize of the inner relation.

Change Summary

Incremental Difference

--- a/doc/hint_list-ja.html
+++ b/doc/hint_list-ja.html
@@ -54,9 +54,11 @@ PostgreSQL 9.2以降で動作します。</td></tr>
5454 <tr><td nowrap>NoBitmapScan(テーブル)</td>
5555 <td>指定したテーブルについて、Bitmap Scan以外でコストが最小となるスキャン方式を選択します。</td></tr>
5656
57-<tr><td rowspan="6" nowrap>結合方式</td>
57+<tr><td rowspan="7" nowrap>結合方式</td>
5858 <td nowrap>NestLoop(テーブル テーブル[ テーブル...])</td>
5959 <td>指定したテーブル間の結合にNested Loopを選択します。</td></tr>
60+ <td nowrap>NestLoop_NM(テーブル テーブル[ テーブル...])</td>
61+ <td>指定したテーブル間の結合にNested Loopを選択しますがマテリアライズを禁止します。</td></tr>
6062 <tr><td nowrap>HashJoin(テーブル テーブル[ テーブル...])</td>
6163 <td>指定したテーブル間の結合にHash Joinを選択します。</td></tr>
6264 <tr><td nowrap>MergeJoin(テーブル テーブル[ テーブル...])</td>
--- a/doc/pg_hint_plan-ja.html
+++ b/doc/pg_hint_plan-ja.html
@@ -256,6 +256,12 @@ postgres-# ORDER BY a.aid;
256256 <p>あるオブジェクトの組み合わせでどのような順番で結合するかを指定できるヒント句のグループです。「Leading」のみを含みます。</p>
257257 <p>結合順序を指定できるオブジェクトは結合方式と同じです。</p>
258258 <p>先に結合して欲しいオブジェクトから順にオブジェクト名または別名を指定します。同じ問合せブロックのオブジェクトに対して複数の結合順序のヒント句を指定した場合は、最後に指定したヒント句が適用されます。 </p>
259+<p>2つのオブジェクトの組を丸括弧で囲うと結合の内外を指定することができます。この指定はネストさせることができます。
260+<pre>
261+Leading((t5 (t1 t2)))
262+</pre>
263+は、t1とt2の結合をt1をアウタとして結合し、さらにそれとt5をt5をアウタとして結合します。
264+</p>
259265 <div class="tips">
260266 <span class="strong"></span>
261267 <p>結合対象のテーブルが3つ以上ある場合、結合方式のヒント句を指定したとしてもコスト見積もりによっては対象のテーブルが直接結合されないことがあります。対象のテーブルが直接結合されない場合は、結合順序のヒント句を併せて指定します。</p>
--- a/pg_hint_plan.c
+++ b/pg_hint_plan.c
@@ -81,6 +81,7 @@ PG_MODULE_MAGIC;
8181 #define HINT_INDEXONLYSCANREGEXP "IndexOnlyScanRegexp"
8282 #define HINT_NOINDEXONLYSCAN "NoIndexOnlyScan"
8383 #define HINT_NESTLOOP "NestLoop"
84+#define HINT_NESTLOOP_NM "NestLoop_NM"
8485 #define HINT_MERGEJOIN "MergeJoin"
8586 #define HINT_HASHJOIN "HashJoin"
8687 #define HINT_NONESTLOOP "NoNestLoop"
@@ -114,13 +115,15 @@ enum
114115 {
115116 ENABLE_NESTLOOP = 0x01,
116117 ENABLE_MERGEJOIN = 0x02,
117- ENABLE_HASHJOIN = 0x04
118+ ENABLE_HASHJOIN = 0x04,
119+ ENABLE_MATERIALIZE = 0x08
118120 } JOIN_TYPE_BITS;
119121
120122 #define ENABLE_ALL_SCAN (ENABLE_SEQSCAN | ENABLE_INDEXSCAN | \
121123 ENABLE_BITMAPSCAN | ENABLE_TIDSCAN | \
122124 ENABLE_INDEXONLYSCAN)
123-#define ENABLE_ALL_JOIN (ENABLE_NESTLOOP | ENABLE_MERGEJOIN | ENABLE_HASHJOIN)
125+#define ENABLE_ALL_JOIN (ENABLE_NESTLOOP | ENABLE_MERGEJOIN | ENABLE_HASHJOIN |\
126+ ENABLE_MATERIALIZE)
124127 #define DISABLE_ALL_SCAN 0
125128 #define DISABLE_ALL_JOIN 0
126129
@@ -141,6 +144,7 @@ typedef enum HintKeyword
141144 HINT_KEYWORD_INDEXONLYSCANREGEXP,
142145 HINT_KEYWORD_NOINDEXONLYSCAN,
143146 HINT_KEYWORD_NESTLOOP,
147+ HINT_KEYWORD_NESTLOOP_NM,
144148 HINT_KEYWORD_MERGEJOIN,
145149 HINT_KEYWORD_HASHJOIN,
146150 HINT_KEYWORD_NONESTLOOP,
@@ -242,6 +246,7 @@ typedef struct JoinMethodHint
242246 unsigned char enforce_mask;
243247 Relids joinrelids;
244248 Relids inner_joinrelids;
249+ bool inhibit_materialize;
245250 } JoinMethodHint;
246251
247252 /* join order hints */
@@ -491,6 +496,7 @@ static const HintParser parsers[] = {
491496 HINT_KEYWORD_INDEXONLYSCANREGEXP},
492497 {HINT_NOINDEXONLYSCAN, ScanMethodHintCreate, HINT_KEYWORD_NOINDEXONLYSCAN},
493498 {HINT_NESTLOOP, JoinMethodHintCreate, HINT_KEYWORD_NESTLOOP},
499+ {HINT_NESTLOOP_NM, JoinMethodHintCreate, HINT_KEYWORD_NESTLOOP_NM},
494500 {HINT_MERGEJOIN, JoinMethodHintCreate, HINT_KEYWORD_MERGEJOIN},
495501 {HINT_HASHJOIN, JoinMethodHintCreate, HINT_KEYWORD_HASHJOIN},
496502 {HINT_NONESTLOOP, JoinMethodHintCreate, HINT_KEYWORD_NONESTLOOP},
@@ -671,6 +677,7 @@ JoinMethodHintCreate(const char *hint_str, const char *keyword,
671677 hint->enforce_mask = 0;
672678 hint->joinrelids = NULL;
673679 hint->inner_joinrelids = NULL;
680+ hint->inhibit_materialize = false;
674681
675682 return (Hint *) hint;
676683 }
@@ -1889,9 +1896,12 @@ JoinMethodHintParse(JoinMethodHint *hint, HintState *hstate, Query *parse,
18891896
18901897 switch (hint_keyword)
18911898 {
1892- case HINT_KEYWORD_NESTLOOP:
1899+ case HINT_KEYWORD_NESTLOOP_NM:
18931900 hint->enforce_mask = ENABLE_NESTLOOP;
18941901 break;
1902+ case HINT_KEYWORD_NESTLOOP:
1903+ hint->enforce_mask |= (ENABLE_NESTLOOP | ENABLE_MATERIALIZE);
1904+ break;
18951905 case HINT_KEYWORD_MERGEJOIN:
18961906 hint->enforce_mask = ENABLE_MERGEJOIN;
18971907 break;
@@ -1899,13 +1909,13 @@ JoinMethodHintParse(JoinMethodHint *hint, HintState *hstate, Query *parse,
18991909 hint->enforce_mask = ENABLE_HASHJOIN;
19001910 break;
19011911 case HINT_KEYWORD_NONESTLOOP:
1902- hint->enforce_mask = ENABLE_ALL_JOIN ^ ENABLE_NESTLOOP;
1912+ hint->enforce_mask = (ENABLE_ALL_JOIN ^ ENABLE_NESTLOOP);
19031913 break;
19041914 case HINT_KEYWORD_NOMERGEJOIN:
1905- hint->enforce_mask = ENABLE_ALL_JOIN ^ ENABLE_MERGEJOIN;
1915+ hint->enforce_mask = (ENABLE_ALL_JOIN ^ ENABLE_MERGEJOIN);
19061916 break;
19071917 case HINT_KEYWORD_NOHASHJOIN:
1908- hint->enforce_mask = ENABLE_ALL_JOIN ^ ENABLE_HASHJOIN;
1918+ hint->enforce_mask = (ENABLE_ALL_JOIN ^ ENABLE_HASHJOIN);
19091919 break;
19101920 default:
19111921 hint_ereport(str, ("Unrecognized hint keyword \"%s\".", keyword));
@@ -2223,6 +2233,7 @@ set_join_config_options(unsigned char enforce_mask, GucContext context)
22232233 SET_CONFIG_OPTION("enable_nestloop", ENABLE_NESTLOOP);
22242234 SET_CONFIG_OPTION("enable_mergejoin", ENABLE_MERGEJOIN);
22252235 SET_CONFIG_OPTION("enable_hashjoin", ENABLE_HASHJOIN);
2236+ SET_CONFIG_OPTION("enable_material", ENABLE_MATERIALIZE);
22262237 }
22272238
22282239 /*
@@ -2480,6 +2491,8 @@ pg_hint_plan_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
24802491 current_hint->init_join_mask |= ENABLE_MERGEJOIN;
24812492 if (enable_hashjoin)
24822493 current_hint->init_join_mask |= ENABLE_HASHJOIN;
2494+ if (enable_material)
2495+ current_hint->init_join_mask |= ENABLE_MATERIALIZE;
24832496
24842497 /*
24852498 * Use PG_TRY mechanism to recover GUC parameters and current_hint to the
Show on old repository browser