From: | Sam Mason <sam(at)samason(dot)me(dot)uk> |
---|---|
To: | pgsql-performance(at)postgresql(dot)org |
Subject: | Optimising queries involving unions |
Date: | 2005-05-26 15:22:03 |
Message-ID: | 20050526152203.GI15205@colo.samason.me.uk |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
Hi,
I've got a query that I think the query optimiser should be able
to work it's magic on but it doesn't! I've had a look around and
asked on the IRC channel and found that the current code doesn't
attempt to optimise for what I'm asking it to do at the moment.
Here's a bad example:
SELECT u.txt
FROM smalltable t, (
SELECT id, txt FROM largetable1
UNION ALL
SELECT id, txt FROM largetable2) u
WHERE t.id = u.id
AND t.foo = 'bar';
I was hoping that "smalltable" would get moved up into the union,
but it doesn't at the moment and the database does a LOT of extra
work. In this case, I can manually do quite a couple of transforms
to move things around and it does the right thing:
SELECT txt
FROM (
SELECT l.id as lid, r.id as rid, r.foo, l.txt
FROM largetable1 l, smalltable r
UNION ALL
SELECT l.id as lid, r.id as rid, r.foo, l.txt
FROM largetable1 l, smalltable r)
WHERE foo = 'bar';
AND lid = rid
The optimiser is intelligent enough to move the where clauses up
into the union and end end up with a reasonably optimal query.
Unfortunatly, in real life, the query is much larger and reorganising
everything manually isn't really feasible!
Is this a good place to ask about this or is it more in the realm
of the hackers mailing list?
Thanks,
Sam
From | Date | Subject | |
---|---|---|---|
Next Message | Brad Might | 2005-05-26 15:36:51 | Specific query performance problem help requested - postgresql 7.4 |
Previous Message | Colton A Smith | 2005-05-26 14:57:53 | poor performance involving a small table |