Ășt 7. 4. 2020 v 18:47 odesĂlatel Andrus <kobrule...@hot.ee> napsal:
> Hi! > > Query returns no rows but its execution time in Postgres 12 depends on the > column expression. > > Query with column expression > > coalesce( (select sum(taitmata) from rid join dok using (dokumnr) > where toode=toode.toode and doktyyp='T' and not dok.taidetud and > dok.kinnitatud and > taitmata is not null),0) > > takes 666 ms : > > explain analyze select > coalesce( (select sum(taitmata) from rid join dok using (dokumnr) > where toode=toode.toode and doktyyp='T' and not dok.taidetud and > dok.kinnitatud and > taitmata is not null),0) > from toode > where toode.ribakood='testmiin'::text > or toode.nimetus ilike '%'||'testmiin'||'%' escape '!' > or toode.toode ilike '%'||'testmiin'||'%' escape '!' > or toode.markused ilike '%'||'testmiin'||'%' escape '!' > or to_tsvector('english',toode.nimetus) @@ > plainto_tsquery('testmiin') > or to_tsvector('english',toode.engnimetus) @@ > plainto_tsquery('testmiin') > > "Gather (cost=1000.00..505930.82 rows=153 width=32) (actual > time=661.419..661.476 rows=0 loops=1)" > " Workers Planned: 1" > " Workers Launched: 1" > " -> Parallel Seq Scan on toode (cost=0.00..10015.31 rows=90 width=21) > (actual time=574.922..574.922 rows=0 loops=2)" > " Filter: (((ribakood)::text = 'testmiin'::text) OR (nimetus ~~* > '%testmiin%'::text) OR (toode ~~* '%testmiin%'::text) OR > (markused ~~* '%testmiin%'::text) OR (to_tsvector('english'::regconfig, > (nimetus)::text) @@ plainto_tsquery('testmiin'::text)) OR > (to_tsvector('english'::regconfig, (engnimetus)::text) @@ > plainto_tsquery('testmiin'::text)))" > " Rows Removed by Filter: 7202" > " SubPlan 1" > " -> Aggregate (cost=3234.63..3234.64 rows=1 width=32) (never > executed)" > " -> Nested Loop (cost=11.26..3234.52 rows=43 width=3) (never > executed)" > " -> Bitmap Heap Scan on rid (cost=10.84..1191.72 > rows=270 width=7) (never executed)" > " Recheck Cond: (toode = toode.toode)" > " Filter: (taitmata IS NOT NULL)" > " -> Bitmap Index Scan on rid_toode_pattern_idx > (cost=0.00..10.77 rows=312 width=0) (never executed)" > " Index Cond: (toode = toode.toode)" > " -> Index Scan using dok_pkey on dok (cost=0.42..7.57 > rows=1 width=4) (never executed)" > " Index Cond: (dokumnr = rid.dokumnr)" > " Filter: ((NOT taidetud) AND kinnitatud AND (doktyyp > = 'T'::bpchar))" > "Planning Time: 2.102 ms" > "JIT:" > " Functions: 24" > " Options: Inlining true, Optimization true, Expressions true, Deforming > true" > " Timing: Generation 5.592 ms, Inlining 95.077 ms, Optimization 463.742 > ms, Emission 277.062 ms, Total 841.473 ms" > "Execution Time: 666.007 ms" > > on your query there is too slow JIT. Is strange how much. So the best way is disable JIT probably set jit to off; or same field in postgresql.conf Regards Pavel > Same query with sime column expression > > 1 > > run 3.6 times faster: > > > explain analyze select 1 > from toode > where toode.ribakood='testmiin'::text > or toode.nimetus ilike '%'||'testmiin'||'%' escape '!' > or toode.toode ilike '%'||'testmiin'||'%' escape '!' > or toode.markused ilike '%'||'testmiin'||'%' escape '!' > or to_tsvector('english',toode.nimetus) @@ > plainto_tsquery('testmiin') > or to_tsvector('english',toode.engnimetus) @@ > plainto_tsquery('testmiin') > > "Gather (cost=1000.00..11030.61 rows=153 width=4) (actual > time=182.414..185.648 rows=0 loops=1)" > " Workers Planned: 1" > " Workers Launched: 1" > " -> Parallel Seq Scan on toode (cost=0.00..10015.31 rows=90 width=4) > (actual time=155.338..155.339 rows=0 loops=2)" > " Filter: (((ribakood)::text = 'testmiin'::text) OR (nimetus ~~* > '%testmiin%'::text) OR (toode ~~* '%testmiin%'::text) OR > (markused ~~* '%testmiin%'::text) OR (to_tsvector('english'::regconfig, > (nimetus)::text) @@ plainto_tsquery('testmiin'::text)) OR > (to_tsvector('english'::regconfig, (engnimetus)::text) @@ > plainto_tsquery('testmiin'::text)))" > " Rows Removed by Filter: 7202" > "Planning Time: 1.729 ms" > "Execution Time: 185.674 ms" > > If there are more column expressions, perfomance difference is bigger. > rid table used in column expression contains 1.8 million of rows. > Performance degradation probably occured if upgraded from Postgres 9.1 to > Postgres 12 > > Since no data is returned query perfomance should be same. > How to fix it ? > > Andrus. > > >