Hi

it is side effect of MVCC implementation of Postgres. There is not possible
vacuum inside open transaction.

If you need it, then you should to use a different database - Postgres
doesn't work well when one record is highly often used in transaction.
Usual solution for Postgres is some proxy, that work like write cache.

Regards

Pavel

2015-03-09 8:47 GMT+01:00 Jan Strube <j...@deriva.de>:

> 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
>
>
>
>
>
> *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
>
>
>

Reply via email to