Re: Help with tuning this query

From: Richard Huxton <dev(at)archonet(dot)com>
To: Ken Egervari <ken(at)upfactor(dot)com>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: Help with tuning this query
Date: 2005-03-02 08:58:06
Message-ID: 4225801E.8010003@archonet.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers-win32 pgsql-performance

Ken Egervari wrote:
> I've tried to use Dan Tow's tuning method

Who? What?

> and created all the right
> indexes from his diagraming method, but the query still performs
> quite slow both inside the application and just inside pgadmin III.
> Can anyone be kind enough to help me tune it so that it performs
> better in postgres? I don't think it's using the right indexes, or
> maybe postgres needs special treatment.
>
> I've converted the below query to SQL from a Hibernate query, so the
> syntax is probably not perfect but it's semantics are exactly the
> same. I've done so by looking at the source code, but I can't run it
> to get the exact SQL since I don't have the database on my home
> machine.

Hibernate is a java thing, no? It'd be helpful to have the actual SQL
the hibernate class (or whatever) generates. One of the problems with
SQL is that you can have multiple ways to get the same results and it's
not always possible for the planner to convert from one to the other.

Anyway, people will want to see EXPLAIN ANALYSE for the query in
question. Obviously, make sure you've vacuumed and analysed the tables
in question recently. Oh, and make sure yousay what version of PG you're
running.

> select s.* from shipment s inner join carrier_code cc on
> s.carrier_code_id = cc.id inner join carrier c on cc.carrier_id =
> c.id inner join carrier_to_person ctp on ctp.carrier_id = c.id inner
> join person p on p.id = ctp.person_id inner join shipment_status cs
> on s.current_status_id = cs.id inner join release_code rc on
> cs.release_code_id = rc.id left join shipment_status ss on
> ss.shipment_id = s.id where p.id = :personId and s.is_purged = false
> and rc.number = '9' and cs is not null and cs.date >= current_date -
> 31 order by cs.date desc

1. Why are you quoting the 9 when checking against rc.number?
2. The "cs is not null" doesn't appear to be qualified - which table?

> Just assume I have no indexes for the moment because while some of
> the indexes I made make it work faster, it's still around 250
> milliseconds and under heavy load, the query performs very badly (6-7
> seconds).

3. If you rewrite the "current_date - 31" as a suitable ago(31) function
then you can use an index on cs.date
4. Are you familiar with the configuration setting "join_collapse_limit"?

--
Richard Huxton
Archonet Ltd

In response to

Responses

Browse pgsql-hackers-win32 by date

  From Date Subject
Next Message Nicolai Tufar 2005-03-02 09:13:19 Re: [pgsql-hackers-win32] snprintf causes regression tests to fail
Previous Message Joerg Hessdoerfer 2005-03-02 08:24:32 Re: [HACKERS] snprintf causes regression tests to fail

Browse pgsql-performance by date

  From Date Subject
Next Message Bricklen Anderson 2005-03-02 16:13:34 Re: Help with tuning this query
Previous Message Michael Fuhr 2005-03-02 08:12:57 Re: What is the postgres sql command for last_user_id ???