pg.ddx.io  pgsql-performance@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: K C Lau <KCLau@attglobal.net>
To: pgsql-performance@postgresql.org
Subject: SELECT DISTINCT Performance Issue
Date: Fri, 03 Jun 2005 09:56:49 +0800
Message-ID: <6.2.1.2.0.20050602190756.05ab2c70@localhost> (raw)

Hi All,

We are testing PostgreSQL 8.0.3 on MS Windows for porting an OLTP system 
from MS SqlServer.

We got a major performance issue which seems to boil down to the following 
type of query:

select DISTINCT ON (PlayerID) PlayerID,AtDate from Player  where 
PlayerID='22220' order by PlayerID desc, AtDate desc;
The Player table has primary key (PlayerID, AtDate) representing data over 
time and the query gets the latest data for a player.

With enable_seqscan forced off (which I'm not sure if that should be done 
for a production system), the average query still takes a very long time to 
return a record:

esdt=> explain analyze select DISTINCT ON (PlayerID) PlayerID,AtDate from 
Player
  where PlayerID='22220' order by PlayerID desc, AtDate desc;
  Unique  (cost=0.00..2507.66 rows=1 width=23) (actual time=0.000..187.000 
rows=1 loops=1)
    ->  Index Scan Backward using pk_player on player  (cost=0.00..2505.55 
rows=8
43 width=23) (actual time=0.000..187.000 rows=1227 loops=1)
          Index Cond: ((playerid)::text = '22220'::text)
  Total runtime: 187.000 ms

It appears that all the 1227 data records for that player were searched, 
even when doing a backward index scan. I would presume that, after locating 
the index for the highest AtDate, only the first data record needs to be 
retrieved.

The following summary of tests seems to confirm my observation. They were 
done on a quiet system (MS Windows 2000 Server, P4 3.0GHz with 
Hyperthreading, 1GB Memory, PostgreSQL shared_buffers = 50000), starting 
with a test database before doing a vacuum:

set enable_seqscan = off;
select		Total runtime: 187.000 ms
again:		Total runtime: 78.000 ms
vacuum analyze verbose player;
select		Total runtime: 47.000 ms
again:		Total runtime: 47.000 ms
reindex table player;
select		Total runtime: 78.000 ms
again:		Total runtime: 63.000 ms
cluster pk_player on player;
select		Total runtime: 16.000 ms
again:		Total runtime: 0.000 ms
set enable_seqscan = on;
analyze verbose player;
select		Total runtime: 62.000 ms
again:		Total runtime: 78.000 ms

Previously, we have also tried to use LIMIT 1 instead of DISTINCT, but the 
performance was no better:
select PlayerID,AtDate from Player where PlayerID='22220' order by PlayerID 
desc, AtDate desc LIMIT 1

Any clue or suggestions would be most appreciated. If you need further info 
or the full explain logs, please let me know.

Regards,
KC.
  




view thread (6+ messages)  latest in thread

Message-ID: <6.2.1.2.0.20050602190756.05ab2c70@localhost>
Permalink:  ../6.2.1.2.0.20050602190756.05ab2c70@localhost/
Also on:    postgresql.org/message-id/6.2.1.2.0.20050602190756.05ab2c70@localhost

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-performance@postgresql.org
  Cc: KCLau@attglobal.net
  Subject: Re: SELECT DISTINCT Performance Issue
  In-Reply-To: <6.2.1.2.0.20050602190756.05ab2c70@localhost>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox