constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | on
enable_material | on
+ enable_memoize | on
enable_mergejoin | on
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
SET pg_hint_plan.parse_messages TO error;
/*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)NestLoop(t1 t1)*/
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | on
enable_material | on
+ enable_memoize | on
enable_mergejoin | on
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
/*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)*/
EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | on
enable_material | on
+ enable_memoize | on
enable_mergejoin | on
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
SET pg_hint_plan.parse_messages TO error;
/*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)NestLoop(t1 t1)*/
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | on
enable_material | on
+ enable_memoize | on
enable_mergejoin | on
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
EXPLAIN (COSTS false) EXECUTE p1;
QUERY PLAN
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | on
enable_material | on
+ enable_memoize | on
enable_mergejoin | on
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
SET pg_hint_plan.parse_messages TO error;
EXPLAIN (COSTS false) EXECUTE p2;
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | on
enable_material | on
+ enable_memoize | on
enable_mergejoin | on
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
-- No. A-12-1-4
-- No. A-12-2-4
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | on
enable_material | on
+ enable_memoize | on
enable_mergejoin | on
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
SET pg_hint_plan.parse_messages TO error;
EXPLAIN (COSTS false) EXECUTE p2;
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | on
enable_material | on
+ enable_memoize | on
enable_mergejoin | on
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
DEALLOCATE p1;
SET pg_hint_plan.parse_messages TO LOG;
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | off
enable_material | on
+ enable_memoize | on
enable_mergejoin | off
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
/*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | off
enable_material | on
+ enable_memoize | on
enable_mergejoin | off
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
QUERY PLAN
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | off
enable_material | on
+ enable_memoize | on
enable_mergejoin | off
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
BEGIN;
/*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | off
enable_material | on
+ enable_memoize | on
enable_mergejoin | off
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
QUERY PLAN
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | off
enable_material | on
+ enable_memoize | on
enable_mergejoin | off
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
/*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
constraint_exclusion | partition
cursor_tuple_fraction | 0.1
default_statistics_target | 100
- force_parallel_mode | off
from_collapse_limit | 8
jit | on
join_collapse_limit | 8
parallel_tuple_cost | 0.1
random_page_cost | 4
seq_page_cost | 1
+ enable_async_append | on
enable_bitmapscan | on
enable_gathermerge | on
enable_hashagg | on
enable_hashjoin | on
+ enable_incremental_sort | on
enable_indexonlyscan | on
enable_indexscan | off
enable_material | on
+ enable_memoize | on
enable_mergejoin | off
enable_nestloop | on
enable_parallel_append | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(46 rows)
+(48 rows)
EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
QUERY PLAN
RETURN new_cnt;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
+-- The function called at the bottom desn't use a hint, the immediate
+-- caller level should restore its own hint. So, the first LOG from
+-- pg_hint_plan should use the IndexScan(t_1) hint
EXPLAIN (COSTS false) SELECT nested_planner(5) FROM s1.t1 t_1 ORDER BY t_1.c1;
NOTICE: nested_planner(5)
NOTICE: nested_planner(4)
NOTICE: nested_planner(2)
NOTICE: nested_planner(1)
LOG: pg_hint_plan:
-no hint
+used hint:
+IndexScan(t_1)
+not used hint:
+duplication hint:
+error hint:
+
LOG: pg_hint_plan:
used hint:
IndexScan(t_1)
Index Only Scan using t1_i1 on t1 t_1
(1 row)
-/*+SeqScan(t_2)*/
+-- The top level uses SeqScan(t_1), but the function should use only
+-- the hint in the function.
+/*+SeqScan(t_1) SeqScan(t_2)*/
EXPLAIN (COSTS false) SELECT nested_planner(5) FROM s1.t1 t_1 ORDER BY t_1.c1;
NOTICE: nested_planner(5)
NOTICE: nested_planner(4)
LOG: pg_hint_plan:
used hint:
+SeqScan(t_1)
not used hint:
SeqScan(t_2)
duplication hint:
error hint:
- QUERY PLAN
----------------------------------------
- Index Only Scan using t1_i1 on t1 t_1
-(1 row)
+ QUERY PLAN
+--------------------------
+ Sort
+ Sort Key: c1
+ -> Seq Scan on t1 t_1
+(3 rows)
----
---- No. A-13-4 output of debugging log on hint status
ORDER BY t_1.c1 LIMIT 1;
$$ LANGUAGE SQL IMMUTABLE;
--No.13-4-1
+-- recall_planner() is reduced to constant while planning using the
+-- hint defined in the function. Then the outer query is planned based
+-- on the following hint. pg_hint_plan shows the log for the function
+-- but the resulting explain output doesn't contain the corresponding
+-- plan.
/*+HashJoin(t_1 t_2)*/
EXPLAIN (COSTS false)
SELECT recall_planner() FROM s1.t1 t_1
ORDER BY t_1.c1;
LOG: pg_hint_plan:
used hint:
-HashJoin(t_1 t_2)
+IndexScan(t_1)
not used hint:
duplication hint:
error hint:
(7 rows)
--No.13-4-2
+--See description for No.13-4-1
/*+HashJoin(st_1 st_2)*/
EXPLAIN (COSTS false)
SELECT recall_planner() FROM s1.t1 st_1
ORDER BY st_1.c1;
LOG: pg_hint_plan:
used hint:
+IndexScan(t_1)
not used hint:
-HashJoin(st_1 st_2)
duplication hint:
error hint:
(7 rows)
--No.13-4-3
+--See description for No.13-4-1
/*+HashJoin(t_1 t_2)*/
EXPLAIN (COSTS false)
SELECT recall_planner() FROM s1.t1 st_1
ORDER BY st_1.c1;
LOG: pg_hint_plan:
used hint:
-HashJoin(t_1 t_2)
+IndexScan(t_1)
not used hint:
duplication hint:
error hint:
(6 rows)
--No.13-4-4
+--See description for No.13-4-1
/*+HashJoin(st_1 st_2)*/
EXPLAIN (COSTS false)
SELECT recall_planner() FROM s1.t1 t_1
ORDER BY t_1.c1;
LOG: pg_hint_plan:
used hint:
+IndexScan(t_1)
not used hint:
-HashJoin(st_1 st_2)
duplication hint:
error hint:
(6 rows)
--No.13-4-5
+-- See description for No.13-4-1. No joins in ths plan, so
+-- pg_hint_plan doesn't complain on the wrongly written error hint.
/*+HashJoin(t_1 t_1)*/
EXPLAIN (COSTS false)
SELECT recall_planner() FROM s1.t1 t_1
ORDER BY t_1.c1;
-INFO: pg_hint_plan: hint syntax error at or near "HashJoin(t_1 t_1)"
-DETAIL: Relation name "t_1" is duplicated.
LOG: pg_hint_plan:
used hint:
+IndexScan(t_1)
not used hint:
duplication hint:
error hint:
-HashJoin(t_1 t_1)
LOG: pg_hint_plan:
used hint:
SELECT recall_planner_one_t() FROM s1.t1 t_1
JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
ORDER BY t_1.c1;
+LOG: pg_hint_plan:
+used hint:
+IndexScan(t_1)
+not used hint:
+duplication hint:
+error hint:
+
QUERY PLAN
---------------------------------------------
Merge Join
ORDER BY t_1.c1;
LOG: pg_hint_plan:
used hint:
+IndexScan(t_1)
not used hint:
-HashJoin(t_1 t_1)
duplication hint:
error hint:
DROP FUNCTION recall_planner_one_t(int);
ERROR: function recall_planner_one_t(integer) does not exist
--No.13-4-7
+-- See description for No.13-4-1. Complains on the wrongly written hint.
/*+HashJoin(t_1 t_1)*/
EXPLAIN (COSTS false)
SELECT recall_planner() FROM s1.t1 t_1
JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
ORDER BY t_1.c1;
-INFO: pg_hint_plan: hint syntax error at or near "HashJoin(t_1 t_1)"
-DETAIL: Relation name "t_1" is duplicated.
LOG: pg_hint_plan:
used hint:
+IndexScan(t_1)
not used hint:
duplication hint:
error hint:
-HashJoin(t_1 t_1)
INFO: pg_hint_plan: hint syntax error at or near "HashJoin(t_1 t_1)"
DETAIL: Relation name "t_1" is duplicated.
ORDER BY t_1.c1;
INFO: pg_hint_plan: hint syntax error at or near "MergeJoin(t_1 t_2)HashJoin(t_1 t_2)"
DETAIL: Conflict join method hint.
-INFO: pg_hint_plan: hint syntax error at or near "MergeJoin(t_1 t_2)HashJoin(t_1 t_2)"
-DETAIL: Conflict join method hint.
LOG: pg_hint_plan:
used hint:
-HashJoin(t_1 t_2)
+IndexScan(t_1)
not used hint:
duplication hint:
-MergeJoin(t_1 t_2)
error hint:
LOG: pg_hint_plan:
-> Seq Scan on t2 t_2
(7 rows)
+--No.14-1-1 plancache invalidation
+CREATE TABLE s1.tpc AS SELECT a FROM generate_series(0, 999) a;
+CREATE INDEX ON s1.tpc(a);
+PREPARE p1 AS SELECT * FROM s1.tpc WHERE a < 999;
+/*+ IndexScan(tpc) */PREPARE p2 AS SELECT * FROM s1.tpc WHERE a < 999;
+/*+ SeqScan(tpc) */PREPARE p3(int) AS SELECT * FROM s1.tpc WHERE a = $1;
+EXPLAIN EXECUTE p1;
+ QUERY PLAN
+------------------------------------------------------
+ Seq Scan on tpc (cost=0.00..17.50 rows=333 width=4)
+ Filter: (a < 999)
+(2 rows)
+
+EXPLAIN EXECUTE p2;
+LOG: pg_hint_plan:
+used hint:
+IndexScan(tpc)
+not used hint:
+duplication hint:
+error hint:
+
+ QUERY PLAN
+------------------------------------------------------------------------
+ Index Scan using tpc_a_idx on tpc (cost=0.28..34.10 rows=333 width=4)
+ Index Cond: (a < 999)
+(2 rows)
+
+EXPLAIN EXECUTE p3(500);
+LOG: pg_hint_plan:
+used hint:
+SeqScan(tpc)
+not used hint:
+duplication hint:
+error hint:
+
+ QUERY PLAN
+----------------------------------------------------
+ Seq Scan on tpc (cost=0.00..17.50 rows=5 width=4)
+ Filter: (a = 500)
+(2 rows)
+
+-- The DROP invalidates the plan caches
+DROP TABLE s1.tpc;
+CREATE TABLE s1.tpc AS SELECT a FROM generate_series(0, 999) a;
+CREATE INDEX ON s1.tpc(a);
+EXPLAIN EXECUTE p1;
+ QUERY PLAN
+------------------------------------------------------
+ Seq Scan on tpc (cost=0.00..17.50 rows=333 width=4)
+ Filter: (a < 999)
+(2 rows)
+
+EXPLAIN EXECUTE p2;
+LOG: pg_hint_plan:
+used hint:
+IndexScan(tpc)
+not used hint:
+duplication hint:
+error hint:
+
+ QUERY PLAN
+------------------------------------------------------------------------
+ Index Scan using tpc_a_idx on tpc (cost=0.28..34.10 rows=333 width=4)
+ Index Cond: (a < 999)
+(2 rows)
+
+EXPLAIN EXECUTE p3(500);
+LOG: pg_hint_plan:
+used hint:
+SeqScan(tpc)
+not used hint:
+duplication hint:
+error hint:
+
+ QUERY PLAN
+----------------------------------------------------
+ Seq Scan on tpc (cost=0.00..17.50 rows=5 width=4)
+ Filter: (a = 500)
+(2 rows)
+
+DEALLOCATE p1;
+DEALLOCATE p2;
+DEALLOCATE p3;
+DROP TABLE s1.tpc;