Re: Factoring where clauses through UNIONS take 2 - Mailing list pgsql-general

From Jonathan Bartlett
Subject Re: Factoring where clauses through UNIONS take 2
Date
Msg-id Pine.GSU.4.44.0304241037000.12528-100000@eskimo.com
Whole thread Raw
In response to Re: Factoring where clauses through UNIONS take 2  (Stephan Szabo <sszabo@megazone23.bigpanda.com>)
Responses Re: Factoring where clauses through UNIONS take 2  (Stephan Szabo <sszabo@megazone23.bigpanda.com>)
List pgsql-general
THe actual view is:

create view all_actions_v2 as select sent_mail, 'REPLY' as type,
cached_campaign as campaign, cached_list_member as list_member, reply_date
as occurence_date, reply_subject as other_data from action_reply UNION
select sent_mail, 'FORWARD' as type, cached_campaign as campaign,
cached_list_member as list_member, forward_date as occurence_date,
destination_email as other_data from action_forward UNION select
ac.sent_mail, 'CLICK' as type, ac.cached_campaign as campaign,
cached_list_member as list_member, ac.click_date as occurence_date, cl.url
as other_data from action_click ac, campaign_links cl where ac.link =
cl.object_id UNION select sent_mail, 'UNSUBSCRIBE' as type,
cached_campaign as campaign, cached_list_member as list_member,
unsubscribe_date as occurence_date, NULL::varchar as other_data from
action_unsubscribe UNION select object_id as sent_mail, 'BOUNCE' as type,
campaign, list_member, date_sent as occurence_date, NULL::varchar as
other_data from campaign_sent_mails where bounced = true UNION select
object_id as sent_mail, 'SENT' as type, campaign, list_member, date_sent
as occurrence_date, NULL::varchar as other_data from campaign_sent_mails
UNION select object_id as sent_mail, 'OPEN' as type, campaign,
list_member, date_opened as occurrence_date, NULL::varchar as other_data
from campaign_sent_mails where date_opened is not NULL;

Manually factoring the where clause through would produce this:

select sent_mail, 'REPLY' as type, cached_campaign as campaign,
cached_list_member as list_member, reply_date as occurence_date,
reply_subject as other_data from action_reply where cached_campaign = 3
UNION select sent_mail, 'FORWARD' as type, cached_campaign as campaign,
cached_list_member as list_member, forward_date as occurence_date,
destination_email as other_data from action_forward where cached_campaign
= 3 UNION select ac.sent_mail, 'CLICK' as type, ac.cached_campaign as
campaign, cached_list_member as list_member, ac.click_date as
occurence_date, cl.url as other_data from action_click ac, campaign_links
cl where ac.link = cl.object_id and cached_campaign = 3 UNION select
sent_mail, 'UNSUBSCRIBE' as type, cached_campaign as campaign,
cached_list_member as list_member, unsubscribe_date as occurence_date,
NULL::varchar as other_data from action_unsubscribe where cached_campaign
= 3 UNION select object_id as sent_mail, 'BOUNCE' as type, campaign,
list_member, date_sent as occurence_date, NULL::varchar as other_data from
campaign_sent_mails where bounced = true and campaign = 3 UNION select
object_id as sent_mail, 'SENT' as type, campaign, list_member, date_sent
as occurrence_date, NULL::varchar as other_data from campaign_sent_mails
where campaign = 3 UNION select object_id as sent_mail, 'OPEN' as type,
campaign, list_member, date_opened as occurrence_date, NULL::varchar as
other_data from campaign_sent_mails where date_opened is not NULL and
campaign = 3;

Using the view, the request takes 10 seconds.  Manually factoring takes 2
seconds.  I'd like to keep the view if possible for a little better data
discipline.

Jon

On Thu, 24 Apr 2003, Stephan Szabo wrote:

>
> On Thu, 24 Apr 2003, Jonathan Bartlett wrote:
>
> > Okay, after upgrading Postgres to 7.3.2, I got some improvements to my
> > query through factoring, but it was obvious my tables needed a little
> > help.  Therefore, I've modified my base tables and views, and now, even
> > with enable_seqscan=off, it's not factoring through.  Here is my query:
> >
> > select * from all_actions where campaign = 3;
> >
> > The full query plan is at the end of the email.  Basically, all_actions is
> > a view of several tables, each of which either have a field called
> > "campaign" or "cached_campaign".  It is indexed for all affected tables.
> > However, for every table it does a sequential scan rather than an indexed
> > scan.  Any ideas on how to get it to at least attempt an indexed scan?
>
> What does the actual view look like?  It seems to be pushing campaign=3
> into a scan of campaign_sent_mails (although it's using a different index
> on that).
>


pgsql-general by date:

Previous
From: Stephan Szabo
Date:
Subject: Re: Factoring where clauses through UNIONS take 2
Next
From: Stephan Szabo
Date:
Subject: Re: Factoring where clauses through UNIONS take 2