Re: Problems pushing down WHERE-clause to underlying view

From: Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>
To: Nicklas Avén <nicklas(dot)aven(at)jordogskog(dot)no>, pgsql-general(at)lists(dot)postgresql(dot)org
Subject: Re: Problems pushing down WHERE-clause to underlying view
Date: 2019-02-16 00:08:59
Message-ID: 9f19bc9e-eec2-04db-67c1-0d449fd5f80c@aklaver.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 2/15/19 12:43 PM, Nicklas Avén wrote:
>
> > I have not had chance to fully go through all of below. Some
> questions/suggestions:
> >
> > 1) Thanks for the formatted queries. If I could make a suggestion,
> when aliasing could you include AS. It would make finding what l.*
> refers to easier for those of us with old eyes:)
> >
> Yes, of course, sorry :-)
>
>
> > 2) t4e_contractor_id is in the shiny_adm.contractor_access table?
> > If not where?
>
> Yes, sorry again, it is there
>
>
> >
> > 3) What is the schema for shiny_adm.contractor_access?
> > In particular what indexes are on it?
> >
> shiny_adm.contractor_access looks like this:
>
>
> CREATE TABLE shiny_adm.contractor_access
> (
>   machine_key text,
>   t4e_contractor_id text,
>   active integer DEFAULT 1,
>   id serial NOT NULL,
>   CONSTRAINT contractor_access_pkey PRIMARY KEY (id),
>   CONSTRAINT contractor_unique UNIQUE (machine_key, t4e_contractor_id),
>   CONSTRAINT co_check_t4e_co_email CHECK
> (utils.verify_email(t4e_contractor_id))
> )
>
>
> CREATE INDEX idx_contractor
>   ON shiny_adm.contractor_access
>   USING btree
>   (t4e_contractor_id COLLATE pg_catalog."default");
>
> CREATE INDEX idx_contractor_mk
>   ON shiny_adm.contractor_access
>   USING btree
>   (machine_key COLLATE pg_catalog."default");
>
>
> I tried to format the below a little better with AS and some more
> consistent indents.
>
>
> I also, in the first query, changed the where clause to filter on
> machine_key in table contractor _access. Just to illustrate the problem
> better.
>
> Both queries filter on the same table which is joined the same way. But
> in the second example the where clause is not pushed to the subquery l
>
>
> Thanks a lot for looking into it
>
>
> Nicklas
>

>
> Next query, the slow one that calculates the whole dataset:
>
>
>
> EXPLAIN ANALYZE
> SELECT
>     l.machine_key,
>     o.object_name,
>     o.sub_object_name,
>     o.object_user_id,
>     o.sub_object_user_id,
>     o.start_date AS object_start_date,
>     s.species_group_name,
>     p.product_group_name,
>     l.m3_sub AS volume_m3sub,
>     l.number_of_logs,
>     mi.basemachine_manufacturer,
>     mi.basemachine_model
> FROM  shiny_adm.contractor_access ci join
>     (
>         SELECT
>             hl.contractor_id,
>             hl.machine_key,
>             hl.operator_key,
>             hl.object_key,
>             hl.sub_object_key,
>             date(hl.harvest_date) AS harvest_date,
>             hl.species_group_key,
>             hl.product_key,
>             sum(hl.m3_sub) AS m3_sub,
>             count(*) AS number_of_logs
>         FROM
>             version_union_tables_r02.harvester_logs AS hl
>         GROUP BY
>             hl.machine_key, hl.contractor_id, hl.operator_key,
> hl.object_key, hl.sub_object_key, (date(hl.harvest_date)),
> hl.species_group_key, hl.product_key
>     )  AS l on l.machine_key=ci.machine_key
>     LEFT JOIN version_union_tables_r02.machine_info  AS mi ON
> l.machine_key::text = mi.machine_key::text
>     LEFT JOIN version_union_tables_r02.objects AS o ON
> l.machine_key::text = o.machine_key::text AND l.object_key =
> o.object_key AND l.sub_object_key = o.sub_object_key
>     LEFT JOIN version_union_tables_r02.products  AS p ON
> l.machine_key::text = p.machine_key::text AND l.product_key = p.product_key
>     LEFT JOIN version_union_tables_r02.species  AS s ON
> l.machine_key::text = s.machine_key::text AND l.species_group_key =
> s.species_group_key
> WHERE t4e_contractor_id = 'nicklas(dot)aven(at)jordogskog(dot)no';

To make it apples to apples try changing above to be more like first query:

...

AS l
LEFT JOIN version_union_tables_r02.machine_info AS mi ON
l.machine_key::text = mi.machine_key::text
LEFT JOIN version_union_tables_r02.objects AS o ON
l.machine_key::text = o.machine_key::text AND l.object_key =
o.object_key AND l.sub_object_key = o.sub_object_key
LEFT JOIN version_union_tables_r02.products AS p ON
l.machine_key::text = p.machine_key::text AND l.product_key = p.product_key
LEFT JOIN version_union_tables_r02.species AS s ON
l.machine_key::text = s.machine_key::text AND l.species_group_key =
s.species_group_key
JOIN shiny_adm.contractor_access AS ci ON l.machine_key=ci.machine_key
WHERE t4e_contractor_id = 'nicklas(dot)aven(at)jordogskog(dot)no'

;
>
> results in this query plan:

--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Ron 2019-02-16 03:16:20 Re: WSL (windows subsystem on linux) users will need to turn fsync off as of 11.2
Previous Message Bruce Klein 2019-02-15 22:04:19 Re: WSL (windows subsystem on linux) users will need to turn fsync off as of 11.2