> Hi,
> 
>  
> does no one have an idea?
> 
> It may be a rare case doing the same UPDATE a thousand times. But I´m really 
> interested why this is not happening when doing DIFFERENT updates. And, of 
> course,  if something could be done on the database side to prevent this 
> behavior in case some application developer does the same “mistake” again.
> 
>  
> Thanks
> 
> Jan


Hi,

in an UPDATE operation PostgreSQL has to create a new tuple and marking the old 
as unread.

A long time ago, what you see here was very common: for a heavy update load 
frequent vaccum
was recommended. Then, in 8.3, a feature called HOT (heap-only tuples) was 
introduced that
made away with this problem.

I'm not 100% sure what happens in your case, but I think the problem is the 
updates
are all in the *same* transaction. That is indeed a rare situation.

Bye,
Chris.


> 
>  
>  
> From: Jan Strube 
> Sent: Tuesday, February 10, 2015 12:03 PM
> To: 'pgsql-general@postgresql.org'
> Subject: Performance slowing down when doing same UPDATE many times
> 
>  
> Hi,
> 
>  
> we recently found a bug in one of our applications which was doing exactly 
> the same UPDATE operation a few thousand times inside a transaction. This 
> caused the UPDATEs to become slower and slower from some milliseconds to some 
> seconds. We already fixed the application but I am wondering if this might be 
> a PostgreSQL bug, too.
> 
>  
> Here is a simple test case that performs and benchmarks 100,000 UPDATEs 
> (benchmarking only every 10,000th to reduce output):
> 
>  
> BEGIN;
> 
> CREATE TEMP TABLE test (id integer PRIMARY KEY, flag boolean DEFAULT false);
> 
> INSERT INTO test (id) SELECT generate_series(1, 100000);
> 
>  
> DO $$
> 
> DECLARE
> 
>   s timestamp;
> 
>   e timestamp;
> 
> BEGIN
> 
>   FOR i IN 1..100000 LOOP
> 
>     SELECT clock_timestamp() INTO s;
> 
>     UPDATE test SET flag = true WHERE id = 12345;
> 
>     SELECT clock_timestamp() INTO e;
> 
>  
>     IF i%10000 = 0 THEN
> 
>       RAISE NOTICE '%', e-s;
> 
>     END IF;
> 
>   END LOOP;
> 
> END $$;
> 
> ROLLBACK;
> 
>  
> The output looks like this:
> 
>  
> NOTICE:  00:00:00.000525
> 
> NOTICE:  00:00:00.000992
> 
> NOTICE:  00:00:00.001404
> 
> NOTICE:  00:00:00.001936
> 
> NOTICE:  00:00:00.002374
> 
> NOTICE:  00:00:00.002925
> 
> NOTICE:  00:00:00.003525
> 
> NOTICE:  00:00:00.004015
> 
> NOTICE:  00:00:00.00453
> 
> NOTICE:  00:00:00.004976
> 
>  
> The problem only occurs inside a transaction and if the same dataset is 
> updated. I´m using PostgreSQL 9.1.15.
> 
>  
> Jan
> 
>  
> 




-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to