Re: Left joining against two empty tables makes a query

From: "Dario" <dario_d_s(at)unitech(dot)com(dot)ar>
To: "Chris Travers" <chris(at)travelamericas(dot)com>
Cc: <pgsql-performance(at)postgresql(dot)org>
Subject: Re: Left joining against two empty tables makes a query
Date: 2005-07-29 23:18:56
Message-ID: MHEDJHCKDNOEHJKHIOCJEEEPCFAA.dario_d_s@unitech.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Sorry for my english.
May I ask? (i'm still learning postgresql). Isn't outer join forcing "join
order"?
The planner will resolve a, then ac in order to resolve left join previously
and will not be able to choose the customer_id filter (more selective)...
AFAIK (not too far :-)) this will be the join order, even if projects and
deparments are not empty, no matter how much statistical info you (the
engine) have (has).

Workaround:
You should probably try to use a subquery to allow planner to choose join
order (as long as you can modify source code :-O ). You know project and
department are empty now so...

SELECT aa.accno, aa.description, aa.link, aa.category, aa.project_id,
aa.department, p.projectnumber, d.description from (
SELECT c.accno, c.description, c.link, c.category, ac.project_id,
a.department_id AS department
FROM chart c JOIN acc_trans ac ON (ac.chart_id = c.id)
JOIN ar a ON (a.id = ac.trans_id)
WHERE a.customer_id = 11373 AND a.id IN (
SELECT max(id) FROM ar WHERE customer_id = 11373)
) aa

LEFT JOIN project p ON (aa.project_id = p.id)
LEFT JOIN department d ON (d.id = aa.department)

Doubt of it. I rewrite it at first sight.

Long life, little spam and prosperity.

-----Mensaje original-----
De: pgsql-performance-owner(at)postgresql(dot)org
[mailto:pgsql-performance-owner(at)postgresql(dot)org]En nombre de Chris
Travers
Enviado el: viernes, 29 de julio de 2005 2:23
Para: Gnanavel S
CC: Chris Travers; pgsql-performance(at)postgresql(dot)org
Asunto: Re: [PERFORM] Left joining against two empty tables makes a
query

>
> Secondly, the project table has *never* had anything in it. So where
> are these numbers coming from?
>
>
> pg_statistics

I very much doubt that. I was unable to locate any rows in pg_statistic
where the pg_class.oid for either table matched any row's starelid.

Tom's argument that this is behavior by design makes sense. I assumed
that something like that had to be going on, otherwise there would be
nowhere for the numbers to come from. I.e. if there never were any rows
in the table, then if pg_statistic is showing 1060 rows, we have bigger
problems than a bad query plan. I hope however that eventually tables
which are truly empty can be treated intelligently sometime in the
future in Left Joins. Otherwise this limits the usefulness of out of
the box solutions which may have functionality that we don't use. Such
solutions can then kill the database performance quite easily.

Chris Travers
Metatron Technology Consulting

---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
message can get through to the mailing list cleanly

In response to

Browse pgsql-performance by date

  From Date Subject
Next Message Karim Nassar 2005-07-30 00:39:41 Re: Performance problems testing with Spamassassin
Previous Message Matthew Schumacher 2005-07-29 21:48:00 Re: Performance problems testing with Spamassassin 3.1.0