On Tue, 2005-11-08 at 00:05 -0700, Charlie Savage wrote:

> Setup: Dell Dimension 3000, Suse 10, 1GB ram, PostgreSQL 8.1 RC 1 with 

> I want to extract data out of the file, with the most important values 
> being stored in a column called tlid.  The tlid field is an integer, and 
> the values are 98% unique.  There is a second column called ogc_fid 
> which is unique (it is a serial field).  I need to extract out unique 
> TLID's (doesn't matter which duplicate I get rid of).  To do this I am 
> running this query:
> SELECT tlid, min(ogc_fid)
> FROM completechain
> GROUP BY tlid;
> The results from explain analyze are:
> "GroupAggregate  (cost=10400373.80..11361807.88 rows=48071704 width=8) 
> (actual time=7311682.715..8315746.835 rows=47599910 loops=1)"
> "  ->  Sort  (cost=10400373.80..10520553.06 rows=48071704 width=8) 
> (actual time=7311682.682..7972304.777 rows=48199165 loops=1)"
> "        Sort Key: tlid"
> "        ->  Seq Scan on completechain  (cost=0.00..2228584.04 
> rows=48071704 width=8) (actual time=27.514..773245.046 rows=48199165 
> loops=1)"
> "Total runtime: 8486057.185 ms"

> Should I expect results like this?  I realize that the computer is quite 
> low-end and is very IO bound for this query, but I'm still surprised 
> that the sort operation takes so long.
> Out of curiosity, I setup an Oracle database on the same machine with 
> the same data and ran the same query.  Oracle was over an order of 
> magnitude faster. Looking at its query plan, it avoided the sort by 
> using "HASH GROUP BY."  Does such a construct exist in PostgreSQL (I see 
> only hash joins)?

PostgreSQL can do HashAggregates as well as GroupAggregates, just like
Oracle. HashAggs avoid the sort phase, so would improve performance
considerably. The difference in performance you are getting is because
of the different plan used. Did you specifically do anything to Oracle
to help it get that plan, or was it a pure out-of-the-box install (or
maybe even a "set this up for Data Warehousing" install)?

To get a HashAgg plan, you need to be able to fit all of the unique
values in memory. That would be 98% of 48071704 rows, each 8+ bytes
wide, giving a HashAgg memory sizing of over 375MB. You must allocate
memory of the next power of two above the level you want, so we would
need to allocate 512MB to work_mem before it would consider using a

Can you let us know how high you have to set work_mem before an EXPLAIN
(not EXPLAIN ANALYZE) chooses the HashAgg plan?

Please be aware that publishing Oracle performance results is against
the terms of their licence and we seek to be both fair and legitimate,
especially within this public discussion forum.

Best Regards, Simon Riggs

---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
       subscribe-nomail command to [EMAIL PROTECTED] so that your
       message can get through to the mailing list cleanly

Reply via email to