Skip site navigation (1) Skip section navigation (2)

Re: Slow query after upgrades

From: Tom Duffey <tduffey(at)techbydesign(dot)com>
To: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: Slow query after upgrades
Date: 2007-12-13 22:37:29
Message-ID: 435EC9B4-F3DD-4136-9070-93E0DBB94B3F@techbydesign.com (view raw or flat)
Thread:
Lists: pgsql-jdbc
On Dec 13, 2007, at 3:58 PM, Guillaume Smet wrote:

> On Dec 13, 2007 10:28 PM, Tom Duffey <tduffey(at)techbydesign(dot)com> wrote:
>> The odd thing is that the same query is used in other components of
>> the application and we have not noticed any issues.  This led me to
>> believe that something about this particular piece is causing the
>> problem, possibly external to the query or the JDBC driver.  Running
>> the query in psql, for example, doesn't seem slow at all.  So maybe
>> it's not a PostgreSQL problem at all but I thought someone might have
>> seen this and have some insight into where I should look.
>
> Usual questions: did you analyze your database after loading the dump?

Yes.

> One of the problem you can meet is that the new driver uses protocol
> v3 by default, which means that your query are prepared and planned
> without the value of the parameters as it was the case using v2 of the
> protocol. This can lead in bad plans in specific cases.
> You may consider using protocol v2 again if it's your problem by
> adding protocolVersion=2 to your JDBC connection URL.
>
>> Is there some logging I can use to compare what is happening on the
>> server side when this query is run by the app with the problem vs.
>> something else (psql or another of our applications)?
>
> Use log_min_duration_statement in your postgresql.conf (0 if you want
> to log every queries).

This seems to be exactly what is happening.  The old driver executes  
the query in 2.6ms while the new driver takes 63516.5ms.  It's worth  
pointing out that this is a large table containing 310646676 rows and  
growing.

Here is the log output when executing the query in psql:

LOG:  duration: 15.771 ms  statement: SELECT point_history.point_id,  
point_history.timestamp, point_history.value, point_history.status  
FROM point_history WHERE point_history.point_id = 21001 AND poi
nt_history.timestamp >= '2007-12-11 22:22:45' ORDER BY  
point_history.timestamp DESC;

Then the pg74.216.jdbc3 driver:

LOG:  duration: 2.682 ms  statement:        SELECT  
point_history.point_id, point_history.timestamp, point_history.value,  
point_history.status FROM point_history WHERE point_history.point_id =  
21001 AND                    point_history.timestamp >= '2007-12-11  
22:27:41'

And the 8.2 JDBC4 driver:

LOG:  duration: 1.047 ms  parse <unnamed>:          SELECT  
point_history.point_id, point_history.timestamp, point_history.value,  
point_history.status FROM point_history WHERE point_history.point_id =  
$1 AND point_history.timestamp >= $2 ORDER BY point_history.timestamp  
DESC
LOG:  duration: 0.335 ms  bind <unnamed>:       SELECT  
point_history.point_id, point_history.timestamp, point_history.value,  
point_history.status FROM point_history WHERE point_history.point_id =  
$1 AND                                     point_history.timestamp >=  
$2 ORDER BY point_history.timestamp DESC
DETAIL:  parameters: $1 = '21001', $2 = '2007-12-11 22:22:45'
LOG:  duration: 63516.530 ms  execute <unnamed>:        SELECT  
point_history.point_id, point_history.timestamp, point_history.value,  
point_history.status FROM point_history WHERE point_history.point_id =  
$1 AND                                     point_history.timestamp >=  
$2 ORDER BY point_history.timestamp DESC
DETAIL:  parameters: $1 = '21001', $2 = '2007-12-11 22:22:45'

Here's what explain has to say about this query:

foo=> EXPLAIN SELECT point_history.point_id, point_history.timestamp,  
point_history.value, point_history.status FROM point_history WHERE  
point_history.point_id = 21001 AND point_history.timestamp >=  
'2007-12-11 22:22:45' ORDER BY point_history.timestamp DESC;
                                                  QUERY PLAN
------------------------------------------------------------------------------------------------------------
  Index Scan Backward using point_history_pkey on point_history   
(cost=0.00..264.60 rows=58 width=20)
    Index Cond: ((point_id = 21001) AND ("timestamp" >= '2007-12-11  
22:22:45'::timestamp without time zone))
(2 rows)

Any suggestions?

Tom


In response to

Responses

pgsql-jdbc by date

Next:From: Guillaume SmetDate: 2007-12-13 22:52:45
Subject: Re: Slow query after upgrades
Previous:From: Guillaume SmetDate: 2007-12-13 21:58:10
Subject: Re: Slow query after upgrades

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group