X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=sql%2Fpg_hint_plan.sql;h=0577f56b5c60cbe797b10c70726404c79b784d5c;hb=b4dff0d5308c0e022554ef5768eb19e16464328a;hp=922399c5731c261f813cb3c1340b6b6fa319788f;hpb=e16a44e7b6e72aa5c539c5b7ce5356ed9be44a50;p=pghintplan%2Fpg_hint_plan.git diff --git a/sql/pg_hint_plan.sql b/sql/pg_hint_plan.sql index 922399c..0577f56 100644 --- a/sql/pg_hint_plan.sql +++ b/sql/pg_hint_plan.sql @@ -12,10 +12,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.val = t2.val; /*+ Test (t1 t2) */ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id; -SET pg_hint_plan.enable TO off; +SET pg_hint_plan.enable_hint TO off; /*+ Test (t1 t2) */ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id; -SET pg_hint_plan.enable TO on; +SET pg_hint_plan.enable_hint TO on; /*Set(enable_indexscan off)*/ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id; @@ -25,6 +25,8 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id; EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id; /*+Set(enable_indexscan off)*/ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id; +EXPLAIN (COSTS false) /*+Set(enable_indexscan off)*/ + SELECT * FROM t1, t2 WHERE t1.id = t2.id; /*+ Set(enable_indexscan off) Set(enable_hashjoin off) */ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id; @@ -118,21 +120,21 @@ EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id; -- single table scan hint test -EXPLAIN SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); +EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); /*+BitmapScan(v_1)*/ -EXPLAIN SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); +EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); /*+BitmapScan(v_2)*/ -EXPLAIN SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); +EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); /*+BitmapScan(t1)*/ -EXPLAIN SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); +EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); /*+BitmapScan(v_1)BitmapScan(v_2)*/ -EXPLAIN SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); +EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); /*+BitmapScan(v_1)BitmapScan(t1)*/ -EXPLAIN SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); +EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); /*+BitmapScan(v_2)BitmapScan(t1)*/ -EXPLAIN SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); +EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); /*+BitmapScan(v_1)BitmapScan(v_2)BitmapScan(t1)*/ -EXPLAIN SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); +EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10); -- full scan hint pattern test EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)'; @@ -511,6 +513,18 @@ SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.i ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = ( SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id ); +/*+HashJoin(t1_1 t3_1)MergeJoin(t1_3 t3_3)NestLoop(t1_2 t2_2)NestLoop(t1_4 t2_4)NestLoop(t1_5 t2_5)Leading(t3_5 t2_5 t1_5)Leading(t3_2 t2_2 t1_2)Leading(t3_4 t2_4 t1_4)Leading(c1_1 t3_3 t2_3 t1_3 t3_1 t2_1 t1_1)*/ +EXPLAIN (COSTS false) +WITH c1_1(id) AS ( +SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id +) +SELECT t1_1.id, ( +SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id +) FROM t1 t1_1, t2 t2_1, t3 t3_1, ( +SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id +) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = ( +SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id +); SET from_collapse_limit TO 1; EXPLAIN (COSTS false) @@ -560,10 +574,274 @@ SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.i ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = ( SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id ); +/*+HashJoin(t1_1 t3_1)MergeJoin(t1_3 t3_3)NestLoop(t1_2 t2_2)NestLoop(t1_4 t2_4)NestLoop(t1_5 t2_5)Leading(t3_5 t2_5 t1_5)Leading(t3_2 t2_2 t1_2)Leading(t3_4 t2_4 t1_4)Leading(c1_1 t3_3 t2_3 t1_3 t3_1 t2_1 t1_1)*/ +EXPLAIN (COSTS false) +WITH c1_1(id) AS ( +SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id +) +SELECT t1_1.id, ( +SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id +) FROM t1 t1_1, t2 t2_1, t3 t3_1, ( +SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id +) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = ( +SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id +); -- ambigous error -EXPLAIN (COSTS false) SELECT * FROM t1, s1.t1, t2 WHERE public.t1.id = s1.t1.id AND public.t1.id = t2.id; +EXPLAIN (COSTS false) SELECT * FROM t1, s0.t1, t2 WHERE public.t1.id = s0.t1.id AND public.t1.id = t2.id; /*+NestLoop(t1 t2)*/ -EXPLAIN (COSTS false) SELECT * FROM t1, s1.t1, t2 WHERE public.t1.id = s1.t1.id AND public.t1.id = t2.id; +EXPLAIN (COSTS false) SELECT * FROM t1, s0.t1, t2 WHERE public.t1.id = s0.t1.id AND public.t1.id = t2.id; /*+Leading(t1 t2 t1)*/ -EXPLAIN (COSTS false) SELECT * FROM t1, s1.t1, t2 WHERE public.t1.id = s1.t1.id AND public.t1.id = t2.id; +EXPLAIN (COSTS false) SELECT * FROM t1, s0.t1, t2 WHERE public.t1.id = s0.t1.id AND public.t1.id = t2.id; + +-- identifier length test +EXPLAIN (COSTS false) SELECT * FROM t1 "123456789012345678901234567890123456789012345678901234567890123" JOIN t2 ON ("123456789012345678901234567890123456789012345678901234567890123".id = t2.id) JOIN t3 ON (t2.id = t3.id); +/*+ +Leading(123456789012345678901234567890123456789012345678901234567890123 t2 t3) +SeqScan(123456789012345678901234567890123456789012345678901234567890123) +MergeJoin(123456789012345678901234567890123456789012345678901234567890123 t2) +Set(123456789012345678901234567890123456789012345678901234567890123 1) +*/ +EXPLAIN (COSTS false) SELECT * FROM t1 "123456789012345678901234567890123456789012345678901234567890123" JOIN t2 ON ("123456789012345678901234567890123456789012345678901234567890123".id = t2.id) JOIN t3 ON (t2.id = t3.id); +/*+ +Leading(1234567890123456789012345678901234567890123456789012345678901234 t2 t3) +SeqScan(1234567890123456789012345678901234567890123456789012345678901234) +MergeJoin(1234567890123456789012345678901234567890123456789012345678901234 t2) +Set(1234567890123456789012345678901234567890123456789012345678901234 1) +Set(cursor_tuple_fraction 0.1234567890123456789012345678901234567890123456789012345678901234) +*/ +EXPLAIN (COSTS false) SELECT * FROM t1 "1234567890123456789012345678901234567890123456789012345678901234" JOIN t2 ON ("1234567890123456789012345678901234567890123456789012345678901234".id = t2.id) JOIN t3 ON (t2.id = t3.id); +SET "123456789012345678901234567890123456789012345678901234567890123" TO 1; +SET "1234567890123456789012345678901234567890123456789012345678901234" TO 1; +SET cursor_tuple_fraction TO 1234567890123456789012345678901234567890123456789012345678901234; + +-- multi error +/*+ Set(enable_seqscan 100)Set(seq_page_cost on)*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id; + +-- debug log of candidate index to use IndexScan +EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1; +/*+IndexScan(t5 t5_id2)*/ +EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1; +/*+IndexScan(t5 no_exist)*/ +EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1; +/*+IndexScan(t5 t5_id1 t5_id2)*/ +EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1; +/*+IndexScan(t5 no_exist t5_id2)*/ +EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1; +/*+IndexScan(t5 no_exist5 no_exist2)*/ +EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1; + +-- outer inner +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; + +/*+Leading((t1))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading((t1 t2))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading((t1 t2 t3))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; + +EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.id < 10; +/*+Leading((t1 t2))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.id < 10; + +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading(((t1 t2) t3))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; + +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10; +/*+Leading((((t1 t2) t3) t4))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10; + +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading(((t1 t2) t3))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading((t1 (t2 t3)))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; + +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10; +/*+Leading(((t1 t2) (t3 t4)))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10; + +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < ( SELECT t1_2.id FROM t1 t1_2, t2 t2_2 WHERE t1_2.id = t2_2.id AND t2_2.val > 100 ORDER BY t1_2.id LIMIT 1); +/*+Leading(((t1 t2) t3)) Leading(((t3 t1) t2))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t1.val = t3.val AND t1.id < ( SELECT t1_2.id FROM t1 t1_2, t2 t2_2 WHERE t1_2.id = t2_2.id AND t2_2.val > 100 ORDER BY t1_2.id LIMIT 1); +/*+Leading(((t1 t2) t3)) Leading((t1_2 t2_2))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < ( SELECT t1_2.id FROM t1 t1_2, t2 t2_2 WHERE t1_2.id = t2_2.id AND t2_2.val > 100 ORDER BY t1_2.id LIMIT 1); +/*+Leading(((((t1 t2) t3) t1_2) t2_2))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < ( SELECT t1_2.id FROM t1 t1_2, t2 t2_2 WHERE t1_2.id = t2_2.id AND t2_2.val > 100 ORDER BY t1_2.id LIMIT 1); + +-- Specified outer/inner leading hint and join method hint at the same time +/*+Leading(((t1 t2) t3))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading(((t1 t2) t3)) MergeJoin(t1 t2)*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading(((t1 t2) t3)) MergeJoin(t1 t2 t3)*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading(((t1 t2) t3)) MergeJoin(t1 t3)*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; + +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10; +/*+Leading(((t1 t2) t3)) MergeJoin(t3 t4)*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10; +/*+Leading(((t1 t2) t3)) MergeJoin(t1 t2 t3 t4)*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10; + +/*+ Leading ( ( t1 ( t2 t3 ) ) ) */ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading((t1(t2 t3)))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading(("t1(t2" "t3)"))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+ Leading ( ( ( t1 t2 ) t3 ) ) */ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading(((t1 t2)t3))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; +/*+Leading(("(t1" "t2)t3"))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10; + +/*+Leading((t1(t2(t3(t4 t5)))))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id; +/*+Leading((t5(t4(t3(t2 t1)))))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id; +/*+Leading(((((t1 t2)t3)t4)t5))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id; +/*+Leading(((((t5 t4)t3)t2)t1))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id; +/*+Leading(((t1 t2)(t3(t4 t5))))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id; +/*+Leading(((t5 t4)(t3(t2 t1))))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id; +/*+Leading((((t1 t2)t3)(t4 t5)))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id; +/*+Leading((((t5 t4)t3)(t2 t1)))*/ +EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id; + +-- inherite table test to specify the index's name +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_pkey)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_id_val_idx)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_val_id_idx)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; + +EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_val)*/ +EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_pkey)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_id2_val)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_val2_id)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; + +/*+IndexScan(p2 p2_pkey)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_c1_id_val_idx)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 no_exist)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_pkey p2_c1_id_val_idx)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_pkey no_exist)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_c1_id_val_idx no_exist)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_pkey p2_c1_id_val_idx no_exist)*/ +EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)'; + +/*+IndexScan(p2 p2_val_idx)*/ +EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_expr)*/ +EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_val_idx6)*/ +EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)'; +/*+IndexScan(p2 p2_val_idx p2_val_idx6)*/ +EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)'; + +-- regular expression +-- ordinary table +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ IndexScanRegexp(t5 t5_[^i].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ IndexScanRegexp(t5 t5_id[0-9].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ IndexScanRegexp(t5 t5[^_].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ IndexScanRegexp(t5 ^.*t5_idaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ IndexScan(t5 t5_id[0-9].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ IndexOnlyScanRegexp(t5 t5_[^i].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ IndexOnlyScanRegexp(t5 t5_id[0-9].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ IndexOnlyScanRegexp(t5 t5[^_].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ IndexOnlyScanRegexp(t5 ^.*t5_idaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ IndexOnlyScan(t5 t5_id[0-9].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ BitmapScanRegexp(t5 t5_[^i].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ BitmapScanRegexp(t5 t5_id[0-9].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ BitmapScanRegexp(t5 t5[^_].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ BitmapScanRegexp(t5 ^.*t5_idaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; +/*+ BitmapScan(t5 t5_id[0-9].*)*/ +EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1; + +-- Inheritance +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ IndexScanRegexp(p1 p1_.*[^0-9]$)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ IndexScanRegexp(p1 p1_.*val2.*)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ IndexScanRegexp(p1 p1[^_].*)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ IndexScan(p1 p1_.*val2.*)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ IndexOnlyScanRegexp(p1 p1_.*[^0-9]$)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ IndexOnlyScanRegexp(p1 p1_.*val2.*)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ IndexOnlyScanRegexp(p1 p1[^_].*)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ IndexOnlyScan(p1 p1_.*val2.*)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ BitmapScanRegexp(p1 p1_.*[^0-9]$)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ BitmapScanRegexp(p1 p1_.*val2.*)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ BitmapScanRegexp(p1 p1[^_].*)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; +/*+ BitmapScan(p1 p1_.*val2.*)*/ +EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1; + +-- search from hint table +INSERT INTO hint_plan.hints (norm_query_string, application_name, hints) VALUES ('EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = ?;', '', 'SeqScan(t1)'); +INSERT INTO hint_plan.hints (norm_query_string, application_name, hints) VALUES ('EXPLAIN (COSTS false) SELECT id FROM t1 WHERE t1.id = ?;', '', 'IndexScan(t1)'); +INSERT INTO hint_plan.hints (norm_query_string, application_name, hints) VALUES ('EXPLAIN SELECT * FROM t1 WHERE t1.id = ?;', '', 'BitmapScan(t1)'); +SELECT * FROM hint_plan.hints ORDER BY id; +SET pg_hint_plan.enable_hint_table = on; +EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = 1; +SET pg_hint_plan.enable_hint_table = off; +EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = 1; +TRUNCATE hint_plan.hints; +VACUUM ANALYZE hint_plan.hints; + +-- plpgsql test +EXPLAIN (COSTS false) SELECT id FROM t1 WHERE t1.id = 1; +DO LANGUAGE plpgsql $$ +DECLARE + id integer; +BEGIN + SELECT /*+SeqScan(t1)*/ t1.id INTO id FROM t1 WHERE t1.id = 1; + RETURN; +END; +$$; +DROP EXTENSION pg_hint_plan;