2015-11-11 19:03 GMT+01:00 Thom Brown <t...@linux.com>:

> On 11 November 2015 at 17:59, Pavel Stehule <pavel.steh...@gmail.com>
> wrote:
> > Hi
> >
> > I have a first query
> >
> > I looked on EXPLAIN ANALYZE output and the numbers of filtered rows are
> > differen
> >
> > postgres=# set max_parallel_degree to 4;
> > SET
> > Time: 0.717 ms
> > postgres=# EXPLAIN ANALYZE select count(*) from xxx where a % 10 = 0;
> >
> ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
> > │                                                          QUERY PLAN
> > │
> >
> ╞═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
> > │ Aggregate  (cost=9282.50..9282.51 rows=1 width=0) (actual
> > time=142.541..142.541 rows=1 loops=1)                               │
> > │   ->  Gather  (cost=1000.00..9270.00 rows=5000 width=0) (actual
> > time=0.633..130.926 rows=100000 loops=1)                      │
> > │         Number of Workers: 2
> > │
> > │         ->  Parallel Seq Scan on xxx  (cost=0.00..7770.00 rows=5000
> > width=0) (actual time=0.052..411.303 rows=169631 loops=1) │
> > │               Filter: ((a % 10) = 0)
> > │
> > │               Rows Removed by Filter: 1526399
> > │
> > │ Planning time: 0.167 ms
> > │
> > │ Execution time: 144.519 ms
> > │
> >
> └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
> > (8 rows)
> >
> > Time: 145.374 ms
> > postgres=# set max_parallel_degree to 1;
> > SET
> > Time: 0.706 ms
> > postgres=# EXPLAIN ANALYZE select count(*) from xxx where a % 10 = 0;
> >
> ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
> > │                                                           QUERY PLAN
> > │
> >
> ╞════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
> > │ Aggregate  (cost=14462.50..14462.51 rows=1 width=0) (actual
> > time=163.355..163.355 rows=1 loops=1)                              │
> > │   ->  Gather  (cost=1000.00..14450.00 rows=5000 width=0) (actual
> > time=0.485..152.827 rows=100000 loops=1)                      │
> > │         Number of Workers: 1
> > │
> > │         ->  Parallel Seq Scan on xxx  (cost=0.00..12950.00 rows=5000
> > width=0) (actual time=0.043..309.740 rows=145364 loops=1) │
> > │               Filter: ((a % 10) = 0)
> > │
> > │               Rows Removed by Filter: 1308394
> > │
> > │ Planning time: 0.129 ms
> > │
> > │ Execution time: 165.102 ms
> > │
> >
> └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
> > (8 rows)
> >
> > Rows removed by filter: 1308394 X 1526399. Is it expected?
>
> Yeah, I noticed the same thing, but more pronounced:
>
> With set max_parallel_degree = 4:
>
> # explain (analyse, buffers, timing, verbose, costs) select count(*)
> from js where content->'tags'->0->>'term' like 'design%' or
> content->'tags'->0->>'term' like 'web%';
>
>             QUERY PLAN
>
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>  Aggregate  (cost=49575.51..49575.52 rows=1 width=0) (actual
> time=744.267..744.267 rows=1 loops=1)
>    Output: count(*)
>    Buffers: shared hit=175423
>    ->  Gather  (cost=1000.00..49544.27 rows=12496 width=0) (actual
> time=0.351..731.662 rows=55151 loops=1)
>          Output: content
>          Number of Workers: 4
>          Buffers: shared hit=175423
>          ->  Parallel Seq Scan on public.js  (cost=0.00..47294.67
> rows=12496 width=0) (actual time=0.030..5912.118 rows=96062 loops=1)
>                Output: content
>                Filter: (((((js.content -> 'tags'::text) -> 0) ->>
> 'term'::text) ~~ 'design%'::text) OR ((((js.content -> 'tags'::text)
> -> 0) ->> 'term'::text) ~~ 'web%'::text))
>                Rows Removed by Filter: 2085546
>                Buffers: shared hit=305123
>  Planning time: 0.123 ms
>  Execution time: 759.313 ms
> (14 rows)
>
>
> With set max_parallel_degree = 0:
>
> # explain (analyse, buffers, timing, verbose, costs) select count(*)
> from js where content->'tags'->0->>'term' like 'design%' or
> content->'tags'->0->>'term' like 'web%';
>
>          QUERY PLAN
>
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>  Aggregate  (cost=212857.25..212857.26 rows=1 width=0) (actual
> time=1235.082..1235.082 rows=1 loops=1)
>    Output: count(*)
>    Buffers: shared hit=175243
>    ->  Seq Scan on public.js  (cost=0.00..212826.01 rows=12496
> width=0) (actual time=0.019..1228.515 rows=55151 loops=1)
>          Output: content
>          Filter: (((((js.content -> 'tags'::text) -> 0) ->>
> 'term'::text) ~~ 'design%'::text) OR ((((js.content -> 'tags'::text)
> -> 0) ->> 'term'::text) ~~ 'web%'::text))
>          Rows Removed by Filter: 1197822
>          Buffers: shared hit=175243
>  Planning time: 0.064 ms
>  Execution time: 1235.108 ms
> (10 rows)
>
> Time: 1235.517 ms
>
>
> Rows removed: 2085546 vs 1197822
> Buffers hit: 305123 vs 175243
>

yes - the another little bit unclean in EXPLAIN is number of workers. If I
understand to the behave, the query is processed by two processes if
workers in the explain is one.

Regards

Pavel


>
> Thom
>

Reply via email to