Re: Problems with inconsistant query performance.

From: Matthew Schumacher <matt(dot)s(at)aptalaska(dot)net>
To: "Jim C(dot) Nasby" <jim(at)nasby(dot)net>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: Problems with inconsistant query performance.
Date: 2006-09-27 21:33:09
Message-ID: 451AEE15.6090103@aptalaska.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Jim,

Thanks for the help. I went and looked at that example and I don't see
how it's different than the "INSERT into radutmp_tab" I'm already doing.
Both raise an exception, the only difference is that I'm not doing
anything with it. Perhaps you are talking about the "IF (NOT FOUND)" I
put after the "UPDATE radutmp_tab". Should this be an EXCEPTION
instead? Also I don't know how this could cause a race condition. As
far as I understand each proc is run in it's own transaction, and the
code in the proc is run serially. Can you explain more why this could
case a race?

Thanks,
schu

Jim C. Nasby wrote:
> Periodically taking longer is probably a case of some other process in
> the database holding a lock you need, or otherwise bogging the system
> down, especially if you're always running acctmessage from the same
> connection (because the query plans shouldn't be changing then). I'd
> suggest looking at what else is happening at the same time.
>
> Also, it's more efficient to operate on chunks of data rather than one
> row at a time whenever possible. If you have to log each row
> individually, consider simply logging them into a table, and then
> periodically pulling data out of that table to do additional processing
> on it.
>
> BTW, your detection of duplicates/row existance has a race condition.
> Take a look at example 36-1 at
> http://www.postgresql.org/docs/8.1/interactive/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING
> for a better way to handle it.

>> ==========================================================================
>> CREATE acctmessage( <lots of accounting columns> )RETURNS void AS $$
>> BEGIN
>> INSERT into tmpaccounting_tab ( ... ) values ( ... );
>>
>> IF _acctType = 'start' THEN
>> BEGIN
>> INSERT into radutmp_tab ( ... ) valuse ( ... );
>> EXCEPTION WHEN UNIQUE_VIOLATION THEN
>> NULL;
>> END;
>> ELSIF _acctType = 'stop' THEN
>> UPDATE radutmp_tab SET ... WHERE sessionId = _sessionId AND userName =
>> _userName;
>> IF (NOT FOUND) THEN
>> INSERT into radutmp_tab ( ... ) values ( ... );
>> END IF;
>>
>> END IF;
>> END;
>> $$
>> LANGUAGE plpgsql;
>> ==========================================================================

In response to

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Jim C. Nasby 2006-09-27 21:42:22 Re: Problems with inconsistant query performance.
Previous Message Graham Davis 2006-09-27 20:56:32 BUG #2658: Query not using index