5 drop table if exists tt1;
6 drop table if exists tt2;
7 drop table if exists tt3;
8 create table tt1 (a int, b int not null, c text);
9 create table tt2 (a int, b int, c text);
10 create table tt3 (a int, b int, c text);
11 create index i_tt1 on tt1(a);
12 create index i_tt2 on tt2(a);
13 create index i_tt3_a on tt3(a);
14 create index i_tt3_b on tt3(b);
15 create or replace function t_tt1_1() returns trigger as $$
21 create or replace function t_tt1_2() returns trigger as $$
27 create trigger tt1_trig_1 before insert or update on tt1
28 for each row execute procedure t_tt1_1();
29 create trigger tt1_trig_2 before insert or update on tt1
30 for each row execute procedure t_tt1_2();
31 insert into tt2 (select a, -a, 'tt2' from generate_series(7000, 17000) a);
32 insert into tt3 (select a, -a, 'tt3' from generate_series(0, 100000) a);
33 insert into tt3 (select 5000, a, 'tt3' from generate_series(0, 40000) a);
34 insert into tt3 (select a, 555, 'tt3' from generate_series(0, 40000) a);
36 \echo ###### Insert, Trigger
37 explain (analyze on, buffers on, verbose on, format :format)
38 insert into tt1 (select a from generate_series(0, 10000) a);
40 \echo ###### Update, Trigger
41 explain (analyze on, buffers on, verbose on, format :format)
42 update tt1 set a = a + 1;
44 explain (analyze on, buffers on, verbose on, format :format)
45 delete from tt1 where a % 10 = 0;
49 insert into tt1 (select a from generate_series(0, 10000) a);
52 \echo ###### Result, Append Seq Scan
53 explain (analyze on, buffers on, verbose on, format :format)
55 (select a + 1, 3 from tt1 union all select a, 4 from tt2) as x;
56 \echo ###### Index scan (forward) ANY, array in expr, escape
57 explain (analyze on, buffers on, verbose on, format :format)
58 select * from tt1 "x""y" where a in (50, 120, 300, 500);
59 \echo ###### Index scan (backward), MergeJoin, Sort, quicksort, alias
60 explain (analyze on, buffers on, verbose on, format :format)
61 select x.b, x.c from tt1 x join tt2 y on (x.a = -y.b * 3)
62 order by x.a desc limit 10;
63 \echo ###### IndexOnlyScan
64 explain (analyze on, buffers on, verbose on, format :format)
65 select a from tt1 where a < 10;
66 \echo ###### Plain Aggregate, CTE, Recursive Union, WorkTable Scan, CTE Scan
67 explain (analyze on, buffers on, verbose on, format :format)
68 with recursive cte1(a) as
70 select a + 1 from cte1 where a < 10)
71 select sum(a) from cte1;
72 \echo ###### FunctionScan, Hash/HashJoin, Nested Loop
73 explain (analyze on, buffers on, verbose on, format :format)
74 select datname from pg_stat_activity;
75 \echo ###### MergeAppend, Values
76 explain (analyze on, buffers on, verbose on, format :format)
77 (select a from tt1 order by a) union all
78 (select a from (values (100), (200), (300)) as tv(a))
80 \echo ###### Append, HashAggregate
81 explain (analyze on, buffers on, verbose on, format :format)
82 select a from tt1 union select b from tt2;
83 \echo ###### GroupAggregate
84 set work_mem = '128kB';
85 explain (analyze on, buffers on, verbose on, format :format)
86 select sum(a) from tt1 group by b;
89 set work_mem = '128kB';
90 explain (analyze on, buffers on, verbose on, format :format)
91 select b from tt1 group by b;
93 \echo ###### SetOp intersect, SbuqueryScan
94 explain (analyze on, buffers on, verbose on, format :format)
95 select a from tt1 intersect select b from tt2 order by a;
96 \echo ###### Sorted SetOp, Sort on Disk
97 set work_mem = '128kB';
98 explain (analyze on, buffers on, verbose on, format :format)
99 select a from tt1 intersect select b from tt2 order by a;
100 set work_mem = '1MB';
101 \echo ###### HashSetOp intersect All, SubqueryScan
102 explain (analyze on, buffers on, verbose on, format :format)
103 select a from tt1 intersect all select b from tt2 order by a;
104 \echo ###### HashSetOp except, SubqueryScan
105 explain (analyze on, buffers on, verbose on, format :format)
106 select a from tt1 except select b from tt2 order by a;
107 \echo ###### HashSetOp except all, SubqueryScan
108 explain (analyze on, buffers on, verbose on, format :format)
109 select a from tt1 except all select b from tt2 order by a;
110 \echo ###### merge LEFT join
111 set work_mem = '64kB';
112 explain (analyze on, buffers on, verbose on, format :format)
113 select x.b from tt1 x left join tt3 y on (x.a = y.a);
114 set work_mem = '1MB';
115 \echo ###### hash FULL join
116 explain (analyze on, buffers on, verbose on, format :format)
117 select x.b from tt1 x full outer join tt2 y on (x.a = y.a);
118 \echo ###### hash SEMI join
119 explain (analyze on, buffers on, verbose on, format :format)
120 select * from tt1 where a = any(select b from tt2);
121 \echo ###### Hash Anti Join
122 explain (analyze on, buffers on, verbose on, format :format)
123 select * from tt1 where not exists (select * from tt2 where tt1.a = tt2.b);
124 \echo ###### WindowAgg
125 explain (analyze on, buffers on, verbose on, format :format)
126 select first_value(a) over (partition by a / 10) from tt1;
128 explain (analyze on, buffers on, verbose on, format :format)
129 select distinct a from tt1 order by a;
130 \echo ###### PlainAggregate
131 explain (analyze on, buffers on, verbose on, format :format)
132 select sum(a) from tt1;
133 \echo ###### BitmapIndexScan/BitmapHeapScan, BitmapOr, lossy
134 set enable_seqscan to false;
135 set work_mem to '64kB';
136 explain (analyze on, buffers on, verbose on, format :format)
137 select * from tt3 where b > -99998;
138 \echo ###### Join Filter
139 set enable_seqscan to true;
140 set enable_indexscan to false;
141 set enable_bitmapscan to false;
142 explain (analyze on, buffers on, verbose on, format :format)
143 SELECT tt2.* from tt2
144 LEFT OUTER JOIN tt3 ON (tt2.a < tt3.a) where tt3.a + tt2.a < 100000
146 reset enable_seqscan;
147 reset enable_indexscan;
148 reset enable_bitmapscan;
151 explain (analyze on, buffers on, verbose on, format :format)
152 select * from tt3 where ctid = '(0,28)';
153 \echo ###### LockRows
155 explain (analyze on, buffers on, verbose on, format :format)
156 select a from tt1 where a % 10 = 0 for update;
158 \echo ###### Materialize
159 explain (analyze on, buffers on, verbose on, format :format)
160 select * from tt1 where a = all(select b from tt2);
162 -- BitmapAnd/Inner/Right/ForegnScan