On Wed, Dec 22, 2021 at 9:23 AM vignesh C <vignes...@gmail.com> wrote:
>
> On Tue, Dec 21, 2021 at 2:29 PM Peter Smith <smithpb2...@gmail.com> wrote:
> >
> > Here is the v51* patch set:
> >
>
> I tweaked the query slightly based on Euler's changes, the explain
> analyze of the updated query based on Euler's suggestions, existing
> query and Euler's query is given below:
> 1) updated query based on Euler's suggestion:
> explain analyze SELECT DISTINCT pg_get_expr(prqual, prrelid)   FROM
> pg_publication p   INNER JOIN pg_publication_rel pr ON (p.oid =
> pr.prpubid)     WHERE pr.prrelid = 16384 AND p.pubname IN ( 'pub1' )
>   AND NOT (select bool_or(puballtables)       FROM pg_publication
>  WHERE pubname in ( 'pub1' ))     AND NOT EXISTS (SELECT 1       FROM
> pg_publication_namespace pn, pg_class c       WHERE c.oid = 16384 AND
> c.relnamespace = pn.pnnspid);
>                                                                QUERY
> PLAN
> ----------------------------------------------------------------------------------------------------------------------------------------
> Unique  (cost=14.68..14.69 rows=1 width=32) (actual time=0.121..0.126
> rows=1 loops=1)
>    InitPlan 1 (returns $0)
>      ->  Aggregate  (cost=1.96..1.97 rows=1 width=1) (actual
> time=0.025..0.026 rows=1 loops=1)
>            ->  Seq Scan on pg_publication  (cost=0.00..1.96 rows=1
> width=1) (actual time=0.016..0.017 rows=1 loops=1)
>                  Filter: (pubname = 'pub1'::name)
>    InitPlan 2 (returns $1)
>      ->  Nested Loop  (cost=0.27..8.30 rows=1 width=0) (actual
> time=0.002..0.003 rows=0 loops=1)
>            Join Filter: (pn.pnnspid = c.relnamespace)
>            ->  Seq Scan on pg_publication_namespace pn
> (cost=0.00..0.00 rows=1 width=4) (actual time=0.001..0.002 rows=0
> loops=1)
>            ->  Index Scan using pg_class_oid_index on pg_class c
> (cost=0.27..8.29 rows=1 width=4) (never executed)
>                  Index Cond: (oid = '16384'::oid)
>    ->  Sort  (cost=4.40..4.41 rows=1 width=32) (actual
> time=0.119..0.121 rows=1 loops=1)
>          Sort Key: (pg_get_expr(pr.prqual, pr.prrelid)) COLLATE "C"
>          Sort Method: quicksort  Memory: 25kB
>          ->  Result  (cost=0.00..4.39 rows=1 width=32) (actual
> time=0.094..0.098 rows=1 loops=1)
>                One-Time Filter: ((NOT $0) AND (NOT $1))
>                ->  Nested Loop  (cost=0.00..4.39 rows=1 width=36)
> (actual time=0.013..0.015 rows=1 loops=1)
>                      Join Filter: (p.oid = pr.prpubid)
>                      ->  Seq Scan on pg_publication p
> (cost=0.00..1.96 rows=1 width=4) (actual time=0.004..0.005 rows=1
> loops=1)
>                            Filter: (pubname = 'pub1'::name)
>                      ->  Seq Scan on pg_publication_rel pr
> (cost=0.00..2.41 rows=1 width=40) (actual time=0.005..0.005 rows=1
> loops=1)
>                            Filter: (prrelid = '16384'::oid)
> Planning Time: 1.014 ms
> Execution Time: 0.259 ms
> (24 rows)
>
> 2) Existing query:
> postgres=# explain analyze SELECT DISTINCT pg_get_expr(prqual,
> prrelid)   FROM pg_publication p
>    INNER JOIN pg_publication_rel pr ON (p.oid = pr.prpubid)     WHERE
> pr.prrelid = 16384 AND p.pubname IN ( 'pub1' )
>  AND NOT (select bool_or(puballtables)       FROM pg_publication
> WHERE pubname in ( 'pub1' ))
>  AND (SELECT count(1)=0       FROM pg_publication_namespace pn,
> pg_class c       WHERE c.oid = 16384 AND c.relnamespace = pn.pnnspid);
>                                                                QUERY
> PLAN
> -----------------------------------------------------------------------------------------------------------------------------------------
> Unique  (cost=14.69..14.70 rows=1 width=32) (actual time=0.162..0.166
> rows=1 loops=1)
>    InitPlan 1 (returns $0)
>      ->  Aggregate  (cost=1.96..1.97 rows=1 width=1) (actual
> time=0.023..0.025 rows=1 loops=1)
>            ->  Seq Scan on pg_publication  (cost=0.00..1.96 rows=1
> width=1) (actual time=0.014..0.016 rows=1 loops=1)
>                  Filter: (pubname = 'pub1'::name)
>    InitPlan 2 (returns $1)
>      ->  Aggregate  (cost=8.30..8.32 rows=1 width=1) (actual
> time=0.044..0.045 rows=1 loops=1)
>            ->  Nested Loop  (cost=0.27..8.30 rows=1 width=0) (actual
> time=0.028..0.029 rows=0 loops=1)
>                  Join Filter: (pn.pnnspid = c.relnamespace)
>                  ->  Seq Scan on pg_publication_namespace pn
> (cost=0.00..0.00 rows=1 width=4) (actual time=0.004..0.004 rows=0
> loops=1)
>                  ->  Index Scan using pg_class_oid_index on pg_class c
>  (cost=0.27..8.29 rows=1 width=4) (never executed)
>                        Index Cond: (oid = '16384'::oid)
>    ->  Sort  (cost=4.40..4.41 rows=1 width=32) (actual
> time=0.159..0.161 rows=1 loops=1)
>          Sort Key: (pg_get_expr(pr.prqual, pr.prrelid)) COLLATE "C"
>          Sort Method: quicksort  Memory: 25kB
>          ->  Result  (cost=0.00..4.39 rows=1 width=32) (actual
> time=0.142..0.147 rows=1 loops=1)
>                One-Time Filter: ((NOT $0) AND $1)
>                ->  Nested Loop  (cost=0.00..4.39 rows=1 width=36)
> (actual time=0.016..0.018 rows=1 loops=1)
>                     Join Filter: (p.oid = pr.prpubid)
>                      ->  Seq Scan on pg_publication p
> (cost=0.00..1.96 rows=1 width=4) (actual time=0.007..0.009 rows=1
> loops=1)
>                            Filter: (pubname = 'pub1'::name)
>                      ->  Seq Scan on pg_publication_rel pr
> (cost=0.00..2.41 rows=1 width=40) (actual time=0.004..0.004 rows=1
> loops=1)
>                            Filter: (prrelid = '16384'::oid)
> Planning Time: 0.966 ms
> Execution Time: 0.327 ms
> (25 rows)
>
> 3) Euler’s Query:
> explain analyze  SELECT DISTINCT pg_catalog.pg_get_expr(pr.prqual,
> pr.prrelid)   FROM pg_catalog.pg_publication p
> INNER JOIN pg_catalog.pg_publication_rel pr ON (p.oid = pr.prpubid)
>  WHERE pr.prrelid = 16384 AND p.pubname IN ( 'pub1' )
> AND NOT (SELECT pg_catalog.bool_or(b.puballtables)       FROM
> pg_catalog.pg_publication b  WHERE b.pubname IN ( 'pub1' ))
> AND NOT EXISTS(       SELECT 1 FROM
> pg_catalog.pg_publication_namespace pn       INNER JOIN
> pg_catalog.pg_class c ON (pn.pnnspid = c.relnamespace)       WHERE
> c.oid = pr.prrelid)
> ;
>
>     QUERY PLAN
> -------------------------------------------------------------------------------------------------------------------------------------------------------------------
> Unique  (cost=14.69..14.70 rows=1 width=32) (actual time=0.231..0.236
> rows=1 loops=1)
>    InitPlan 1 (returns $0)
>      ->  Aggregate  (cost=1.96..1.97 rows=1 width=1) (actual
> time=0.031..0.032 rows=1 loops=1)
>            ->  Seq Scan on pg_publication b  (cost=0.00..1.96 rows=1
> width=1) (actual time=0.019..0.021 rows=1 loops=1)
>                  Filter: (pubname = 'pub1'::name)
>    ->  Sort  (cost=12.71..12.72 rows=1 width=32) (actual
> time=0.228..0.231 rows=1 loops=1)
>          Sort Key: (pg_get_expr(pr.prqual, pr.prrelid)) COLLATE "C"
>          Sort Method: quicksort  Memory: 25kB
>          ->  Result  (cost=0.27..12.70 rows=1 width=32) (actual
> time=0.205..0.210 rows=1 loops=1)
>                One-Time Filter: (NOT $0)
>                ->  Nested Loop  (cost=0.27..12.70 rows=1 width=36)
> (actual time=0.103..0.107 rows=1 loops=1)
>                      Join Filter: (pr.prpubid = p.oid)
>                      ->  Nested Loop Anti Join  (cost=0.27..10.73
> rows=1 width=40) (actual time=0.093..0.096 rows=1 loops=1)
>                            Join Filter: (c.oid = pr.prrelid)
>                            ->  Seq Scan on pg_publication_rel pr
> (cost=0.00..2.41 rows=1 width=40) (actual time=0.008..0.009 rows=1
> loops=1)
>                                  Filter: (prrelid = '16384'::oid)
>                            ->  Nested Loop  (cost=0.27..8.30 rows=1
> width=4) (actual time=0.079..0.080 rows=0 loops=1)
>                                  Join Filter: (pn.pnnspid = c.relnamespace)
>                                  ->  Index Scan using
> pg_class_oid_index on pg_class c  (cost=0.27..8.29 rows=1 width=8)
> (actual time=0.069..0.072 rows=1 loops=1)
>                                        Index Cond: (oid = '16384'::oid)
>                                  ->  Seq Scan on
> pg_publication_namespace pn  (cost=0.00..0.00 rows=1 width=4) (actual
> time=0.005..0.005 rows=0 loops=1)
>                      ->  Seq Scan on pg_publication p
> (cost=0.00..1.96 rows=1 width=4) (actual time=0.007..0.007 rows=1
> loops=1)
>                            Filter: (pubname = 'pub1'::name)
> Planning Time: 1.067 ms
> Execution Time: 0.431 ms
> (25 rows)
>
> Combining existing query to include NOT EXISTS based on Euler's
> changes seems to be better:
> SELECT DISTINCT pg_get_expr(prqual, prrelid)   FROM pg_publication p
> INNER JOIN pg_publication_rel pr ON (p.oid = pr.prpubid)
> WHERE pr.prrelid = 16384 AND p.pubname IN ( 'pub1' )
> AND NOT (select bool_or(puballtables)
> FROM pg_publication
> WHERE pubname in ( 'pub1' ))
> AND NOT EXISTS (SELECT 1
> FROM pg_publication_namespace pn, pg_class c
> WHERE c.oid = 16384 AND c.relnamespace = pn.pnnspid);
>

The modified query proposed by you seems better to me based on time.

-- 
With Regards,
Amit Kapila.


Reply via email to