postgres=# </pre>
<h3 id="hint-rule">ヒントの記述方法</h3>
-<p>ヒントはクエリの前のブロックコメント内に、スペース、タブ、または改行のいずれかで区切って記述してください。ヒントの対象は、カッコ内にオブジェクト名または別名(エイリアス)で指定してください。</p>
+<p>ã\83\92ã\83³ã\83\88ã\81¯ã\82¯ã\82¨ã\83ªã\81®å\89\8dã\81®ã\83\96ã\83ã\83\83ã\82¯ã\82³ã\83¡ã\83³ã\83\88å\86\85ã\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¦è¨\98è¿°ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\83\96ã\83ã\83\83ã\82¯ã\82³ã\83¡ã\83³ã\83\88ã\82\92ã\83\92ã\83³ã\83\88ã\81¨ã\81\97ã\81¦èª\8dè\98ã\81\95ã\81\9bã\82\8bã\81«ã\81¯ã\80\81ã\83\96ã\83ã\83\83ã\82¯ã\82³ã\83¡ã\83³ã\83\88ã\81®é\96\8bå§\8bç\9b´å¾\8cã\81«+ï¼\88ã\83\97ã\83©ã\82¹ï¼\89ã\82\92æ\8c\87å®\9aã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\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(ã\82¨ã\82¤ã\83ªã\82¢ã\82¹)ã\81§æ\8c\87å®\9aã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82</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*# */
<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;
<dd>スキーマ違いや同一テーブルの複数回使用などでクエリ中に同一名称のテーブルが複数回出現する場合は、テーブルに別名をつけてそれぞれのテーブルを区別してください。以下の例の1つ目のSQL文では、MergeJoin(t1 t1)をヒントに指定したとき、ヒント対象のオブジェクトが特定できずにエラーになっています。2つ目のSQL文では、各テーブルにptやstという別名をつけているため、実行計画作成時にヒントで指定した通りにMerge Joinを選択しています。
</p>
<pre>
-postgres=# /* <span class="strong">MergeJoin(t1 t1)</span>*/
+postgres=# /*+ <span class="strong">MergeJoin(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)"
-> Seq Scan on t1 (cost=0.00..145.00 rows=10000 width=8)
(5 rows)
-postgres=# /* <span class="strong">MergeJoin(pt st)</span> */
+postgres=# /*+ <span class="strong">MergeJoin(pt st)</span> */
postgres-# EXPLAIN SELECT * FROM s1.t1 st
postgres-# JOIN public.t1 pt ON (st.id=pt.id);
QUERY PLAN
-> Index Scan using t1_val on t1
(5 rows)
-/* Test (t1 t2) */
+/*+ Test (t1 t2) */
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
INFO: hint syntax error at or near "Test (t1 t2) "
DETAIL: Keyword "Test" does not exist.
(4 rows)
SET pg_hint_plan.enable TO off;
-/* Test (t1 t2) */
+/*+ Test (t1 t2) */
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
--------------------------------------
(4 rows)
SET pg_hint_plan.enable TO on;
-/*Set(enable_indexscan off)*/
+/*+Set(enable_indexscan off)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
------------------------------
-> Seq Scan on t2
(5 rows)
-/* Set(enable_indexscan off) Set(enable_hashjoin off) */
+/*+ Set(enable_indexscan off) Set(enable_hashjoin off) */
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
-------------------------------
-> Seq Scan on t2
(8 rows)
-/* Set ( enable_indexscan off ) */
+/*+ Set ( enable_indexscan off ) */
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
------------------------------
-> Seq Scan on t2
(5 rows)
-/*
+/*+
Set
(
enable_indexscan
-> Seq Scan on t2
(5 rows)
-/* Set(enable_indexscan off)Set(enable_nestloop off)Set(enable_mergejoin off)
+/*+ Set(enable_indexscan off)Set(enable_nestloop off)Set(enable_mergejoin off)
Set(enable_seqscan off)
*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-> Index Scan using t2_pkey on t2
(5 rows)
-/*Set(work_mem "1M")*/
+/*+Set(work_mem "1M")*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
INFO: invalid value for parameter "work_mem": "1M"
HINT: Valid units for this parameter are "kB", "MB", and "GB".
-> Index Scan using t2_pkey on t2
(4 rows)
-/*Set(work_mem "1MB")*/
+/*+Set(work_mem "1MB")*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
--------------------------------------
-> Index Scan using t2_pkey on t2
(4 rows)
-/*Set(work_mem TO "1MB")*/
+/*+Set(work_mem TO "1MB")*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
INFO: hint syntax error at or near ""1MB")"
DETAIL: Closed parenthesis is necessary.
-> Index Scan using t2_pkey on t2
(4 rows)
-/*SeqScan(t1 t2)*/
+/*+SeqScan(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
INFO: hint syntax error at or near "t2)"
DETAIL: Closed parenthesis is necessary.
-> Index Scan using t2_pkey on t2
(4 rows)
-/*SeqScan(t1)*/
+/*+SeqScan(t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
------------------------------
-> Seq Scan on t2
(5 rows)
-/*SeqScan(t1)IndexScan(t2)*/
+/*+SeqScan(t1)IndexScan(t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
--------------------------------------------
-> Index Scan using t2_pkey on t2
(5 rows)
-/*BitmapScan(t2)*/
+/*+BitmapScan(t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
--------------------------------------
Index Cond: (id = t1.id)
(4 rows)
-/*BitmapScan(t2)NoSeqScan(t1)*/
+/*+BitmapScan(t2)NoSeqScan(t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
--------------------------------------
Index Cond: (id = t1.id)
(4 rows)
-/*NoIndexScan(t1)*/
+/*+NoIndexScan(t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
------------------------------
-> Seq Scan on t2
(5 rows)
-/*NoBitmapScan(t1)*/
+/*+NoBitmapScan(t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t4 WHERE t1.val < 10;
QUERY PLAN
----------------------------
-> Seq Scan on t4
(5 rows)
-/*TidScan(t4)*/
+/*+TidScan(t4)*/
EXPLAIN (COSTS false) SELECT * FROM t3, t4 WHERE t3.id = t4.id AND t4.ctid = '(1,1)';
QUERY PLAN
-----------------------------------------------
TID Cond: (ctid = '(1,1)'::tid)
(7 rows)
-/*NoTidScan(t1)*/
+/*+NoTidScan(t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)';
QUERY PLAN
---------------------------------------
Index Cond: (id = t1.id)
(5 rows)
-/*HashJoin(t1 t2)*/
+/*+HashJoin(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
------------------------------
-> Seq Scan on t2
(5 rows)
-/*NestLoop(t1 t2)*/
+/*+NestLoop(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
--------------------------------------
Index Cond: (id = t2.id)
(4 rows)
-/*NoMergeJoin(t1 t2)*/
+/*+NoMergeJoin(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
QUERY PLAN
------------------------------
-> Seq Scan on t2
(5 rows)
-/*MergeJoin(t1 t3)*/
+/*+MergeJoin(t1 t3)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
QUERY PLAN
-------------------------------------
-> Seq Scan on t3
(6 rows)
-/*NestLoop(t1 t3)*/
+/*+NestLoop(t1 t3)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
QUERY PLAN
-------------------------------------
Index Cond: (val = t3.val)
(4 rows)
-/*NoHashJoin(t1 t3)*/
+/*+NoHashJoin(t1 t3)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
QUERY PLAN
-------------------------------------
Index Cond: (val = t3.val)
(4 rows)
-/*MergeJoin(t4 t1 t2 t3)*/
+/*+MergeJoin(t4 t1 t2 t3)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
QUERY PLAN
--------------------------------------------------
-> Seq Scan on t4
(12 rows)
-/*HashJoin(t3 t4 t1 t2)*/
+/*+HashJoin(t3 t4 t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
QUERY PLAN
--------------------------------------------------------
-> Seq Scan on t4
(13 rows)
-/*NestLoop(t2 t3 t4 t1) IndexScan(t3)*/
+/*+NestLoop(t2 t3 t4 t1) IndexScan(t3)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
QUERY PLAN
--------------------------------------------------
Index Cond: (id = t1.id)
(12 rows)
-/*NoNestLoop(t4 t1 t3 t2)*/
+/*+NoNestLoop(t4 t1 t3 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
QUERY PLAN
--------------------------------------------------
-> Seq Scan on t4
(12 rows)
-/*Leading(t3 t4)*/
+/*+Leading(t3 t4)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
QUERY PLAN
--------------------------------------------------
Index Cond: (id = t2.id)
(12 rows)
-/*Leading(t3 t4 t1)*/
+/*+Leading(t3 t4 t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
QUERY PLAN
--------------------------------------------------
Index Cond: (id = t1.id)
(12 rows)
-/*Leading(t3 t4 t1 t2)*/
+/*+Leading(t3 t4 t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
QUERY PLAN
--------------------------------------------------
Index Cond: (id = t1.id)
(12 rows)
-/*Leading(t3 t4 t1 t2 t1)*/
+/*+Leading(t3 t4 t1 t2 t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
INFO: hint syntax error at or near "Leading(t3 t4 t1 t2 t1)"
DETAIL: In Leading hint, specified relation name 4 or less.
Index Cond: (id = t1.id)
(12 rows)
-/*Leading(t3 t4 t4)*/
+/*+Leading(t3 t4 t4)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
QUERY PLAN
--------------------------------------------------
Index Cond: (id = "*VALUES*".column1)
(4 rows)
-/*HashJoin(t1 t2)*/
+/*+HashJoin(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
INFO: hint syntax error at or near "HashJoin(t1 t2)"
DETAIL: Relation "t2" does not exist.
Index Cond: (id = "*VALUES*".column1)
(4 rows)
-/*HashJoin(t1 *VALUES*)*/
+/*+HashJoin(t1 *VALUES*)*/
EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
QUERY PLAN
-------------------------------------------
-> Values Scan on "*VALUES*"
(5 rows)
-/*HashJoin(t1 *VALUES*) IndexScan(t1) IndexScan(*VALUES*)*/
+/*+HashJoin(t1 *VALUES*) IndexScan(t1) IndexScan(*VALUES*)*/
EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
QUERY PLAN
-------------------------------------------
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:PREPAREでヒント句を指定しても、実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p1 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
LOG: /*
NestLoop(t1 t2)
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:パラメータがない場合は、1回目のEXPLAINで実行計画が決定する
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p2 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
LOG: /*
NestLoop(t1 t2)
*/
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p2;
QUERY PLAN
--------------------------------------------
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:5回目のEXPLAINまでヒント句を指定しても、6回目以降は本来の実行計画に戻る
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p3 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
LOG: /*
NestLoop(t1 t2)
*/
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
QUERY PLAN
--------------------------------------------------------
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:6回目のEXPLAINまでヒント句を指定すると、7回目以降も実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p4 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
LOG: /*
NestLoop(t1 t2)
*/
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
QUERY PLAN
--------------------------------------------------------
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:6回目のEXPLAINでヒント句を指定すると、7回目以降も実行計画を制御できる
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p5 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
LOG: /*
NestLoop(t1 t2)
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p5 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p5 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p5 (10);
QUERY PLAN
--------------------------------------------------------
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:7回目以降のEXPLAINでヒント句を指定しても、以降も実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p6 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
LOG: /*
NestLoop(t1 t2)
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p6 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p6 (10);
QUERY PLAN
--------------------------------------------------------
-- 9.1:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
-- 9.2:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p7 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
LOG: /*
NestLoop(t1 t2)
*/
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
QUERY PLAN
--------------------------------------------------------
Index Cond: ((id > $1) AND (id = t2.id))
(5 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
QUERY PLAN
--------------------------------------------------------
-> Index Scan using t2_pkey on t2
(6 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
QUERY PLAN
--------------------------------------------
-> Index Scan using t2_pkey on t2
(6 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
QUERY PLAN
--------------------------------------------
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:PREPAREでヒント句を指定しても、実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p1 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
EXPLAIN (COSTS false) EXECUTE p1;
QUERY PLAN
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:パラメータがない場合は、1回目のEXPLAINで実行計画が決定する
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p2 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p2;
LOG: /*
HashJoin(t1 t2)
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:5回目のEXPLAINまでヒント句を指定しても、6回目以降は本来の実行計画に戻る
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p3 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
LOG: /*
HashJoin(t1 t2)
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:6回目のEXPLAINまでヒント句を指定すると、7回目以降も実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p4 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
LOG: /*
HashJoin(t1 t2)
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:6回目のEXPLAINでヒント句を指定すると、7回目以降も実行計画を制御できる
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p5 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
EXPLAIN (COSTS false) EXECUTE p5 (10);
QUERY PLAN
-> Index Only Scan using t2_pkey on t2
(6 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p5 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p5 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p5 (10);
LOG: /*
HashJoin(t1 t2)
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:7回目以降のEXPLAINでヒント句を指定しても、以降も実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p6 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
EXPLAIN (COSTS false) EXECUTE p6 (10);
QUERY PLAN
-> Index Only Scan using t2_pkey on t2
(6 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p6 (10);
QUERY PLAN
-------------------------------------------------
-> Index Only Scan using t2_pkey on t2
(6 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p6 (10);
QUERY PLAN
-------------------------------------------------
-- 9.1:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
-- 9.2:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p7 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
LOG: /*
HashJoin(t1 t2)
-> Index Only Scan using t2_pkey on t2
(6 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
QUERY PLAN
-------------------------------------------------
-> Index Only Scan using t2_pkey on t2
(6 rows)
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
LOG: /*
HashJoin(t1 t2)
-> Seq Scan on t2
(7 rows)
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
QUERY PLAN
-------------------------------------------------
#error unsupported PostgreSQL version
#endif
-#define HINT_START "/*"
-#define HINT_END "*/"
+#define BLOCK_COMMENT_START "/*"
+#define BLOCK_COMMENT_END "*/"
+#define HINT_COMMENT_KEYWORD "+"
+#define HINT_START BLOCK_COMMENT_START HINT_COMMENT_KEYWORD
+#define HINT_END BLOCK_COMMENT_END
/* hint keywords */
#define HINT_SEQSCAN "SeqScan"
if (strncmp(p, HINT_START, len))
return NULL;
+ head = (char *) p;
p += len;
skip_space(p);
+ /* find hint end keyword. */
if ((tail = strstr(p, HINT_END)) == NULL)
{
- parse_ereport(debug_query_string, ("unterminated /* comment"));
+ parse_ereport(head, ("unterminated block comment"));
return NULL;
}
/* 入れ子にしたブロックコメントはサポートしない */
- if ((head = strstr(p, HINT_START)) != NULL && head < tail)
+ if ((head = strstr(p, BLOCK_COMMENT_START)) != NULL && head < tail)
parse_ereport(head, ("block comments nest doesn't supported"));
/* ヒント句部分を切り出す */
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.val = t2.val;
-/* Test (t1 t2) */
+/*+ Test (t1 t2) */
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
SET pg_hint_plan.enable TO off;
-/* Test (t1 t2) */
+/*+ Test (t1 t2) */
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
SET pg_hint_plan.enable TO on;
-/*Set(enable_indexscan off)*/
+/*+Set(enable_indexscan off)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/* Set(enable_indexscan off) Set(enable_hashjoin off) */
+/*+ Set(enable_indexscan off) Set(enable_hashjoin off) */
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/* Set ( enable_indexscan off ) */
+/*+ Set ( enable_indexscan off ) */
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*
+/*+
Set
(
enable_indexscan
)
*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/* Set(enable_indexscan off)Set(enable_nestloop off)Set(enable_mergejoin off)
+/*+ Set(enable_indexscan off)Set(enable_nestloop off)Set(enable_mergejoin off)
Set(enable_seqscan off)
*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*Set(work_mem "1M")*/
+/*+Set(work_mem "1M")*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*Set(work_mem "1MB")*/
+/*+Set(work_mem "1MB")*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*Set(work_mem TO "1MB")*/
+/*+Set(work_mem TO "1MB")*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*SeqScan(t1 t2)*/
+/*+SeqScan(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*SeqScan(t1)*/
+/*+SeqScan(t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*SeqScan(t1)IndexScan(t2)*/
+/*+SeqScan(t1)IndexScan(t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*BitmapScan(t2)*/
+/*+BitmapScan(t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*BitmapScan(t2)NoSeqScan(t1)*/
+/*+BitmapScan(t2)NoSeqScan(t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*NoIndexScan(t1)*/
+/*+NoIndexScan(t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*NoBitmapScan(t1)*/
+/*+NoBitmapScan(t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t4 WHERE t1.val < 10;
-/*TidScan(t4)*/
+/*+TidScan(t4)*/
EXPLAIN (COSTS false) SELECT * FROM t3, t4 WHERE t3.id = t4.id AND t4.ctid = '(1,1)';
-/*NoTidScan(t1)*/
+/*+NoTidScan(t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)';
-/*HashJoin(t1 t2)*/
+/*+HashJoin(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*NestLoop(t1 t2)*/
+/*+NestLoop(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*NoMergeJoin(t1 t2)*/
+/*+NoMergeJoin(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*MergeJoin(t1 t3)*/
+/*+MergeJoin(t1 t3)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
-/*NestLoop(t1 t3)*/
+/*+NestLoop(t1 t3)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
-/*NoHashJoin(t1 t3)*/
+/*+NoHashJoin(t1 t3)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
-/*MergeJoin(t4 t1 t2 t3)*/
+/*+MergeJoin(t4 t1 t2 t3)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*HashJoin(t3 t4 t1 t2)*/
+/*+HashJoin(t3 t4 t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*NestLoop(t2 t3 t4 t1) IndexScan(t3)*/
+/*+NestLoop(t2 t3 t4 t1) IndexScan(t3)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*NoNestLoop(t4 t1 t3 t2)*/
+/*+NoNestLoop(t4 t1 t3 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*Leading(t3 t4)*/
+/*+Leading(t3 t4)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*Leading(t3 t4 t1)*/
+/*+Leading(t3 t4 t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*Leading(t3 t4 t1 t2)*/
+/*+Leading(t3 t4 t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*Leading(t3 t4 t1 t2 t1)*/
+/*+Leading(t3 t4 t1 t2 t1)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*Leading(t3 t4 t4)*/
+/*+Leading(t3 t4 t4)*/
EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
-/*HashJoin(t1 t2)*/
+/*+HashJoin(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
-/*HashJoin(t1 *VALUES*)*/
+/*+HashJoin(t1 *VALUES*)*/
EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
-/*HashJoin(t1 *VALUES*) IndexScan(t1) IndexScan(*VALUES*)*/
+/*+HashJoin(t1 *VALUES*) IndexScan(t1) IndexScan(*VALUES*)*/
EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:PREPAREでヒント句を指定しても、実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p1 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
EXPLAIN (COSTS false) EXECUTE p1;
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:パラメータがない場合は、1回目のEXPLAINで実行計画が決定する
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p2 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p2;
EXPLAIN (COSTS false) EXECUTE p2;
EXPLAIN (COSTS false) EXECUTE p2;
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:5回目のEXPLAINまでヒント句を指定しても、6回目以降は本来の実行計画に戻る
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p3 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p3 (10);
EXPLAIN (COSTS false) EXECUTE p3 (10);
EXPLAIN (COSTS false) EXECUTE p3 (10);
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:6回目のEXPLAINまでヒント句を指定すると、7回目以降も実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p4 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p4 (10);
EXPLAIN (COSTS false) EXECUTE p4 (10);
EXPLAIN (COSTS false) EXECUTE p4 (10);
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:6回目のEXPLAINでヒント句を指定すると、7回目以降も実行計画を制御できる
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p5 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
EXPLAIN (COSTS false) EXECUTE p5 (10);
EXPLAIN (COSTS false) EXECUTE p5 (10);
EXPLAIN (COSTS false) EXECUTE p5 (10);
EXPLAIN (COSTS false) EXECUTE p5 (10);
EXPLAIN (COSTS false) EXECUTE p5 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p5 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p5 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p5 (10);
-- 9.1:PREPAREで指定したヒント句で実行計画が固定される
-- 9.2:7回目以降のEXPLAINでヒント句を指定しても、以降も実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p6 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
EXPLAIN (COSTS false) EXECUTE p6 (10);
EXPLAIN (COSTS false) EXECUTE p6 (10);
EXPLAIN (COSTS false) EXECUTE p6 (10);
EXPLAIN (COSTS false) EXECUTE p6 (10);
EXPLAIN (COSTS false) EXECUTE p6 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p6 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p6 (10);
-- 9.1:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
-- 9.2:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
PREPARE p7 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
EXPLAIN (COSTS false) EXECUTE p7 (10);
EXPLAIN (COSTS false) EXECUTE p7 (10);
ANALYZE t1;
EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > 10;
EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
INSERT INTO t1 SELECT i, i % 100 FROM (SELECT generate_series(1, 10000) i) t;
ANALYZE t1;
EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > 10;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
EXPLAIN (COSTS false) EXECUTE p7 (10);