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

Re: Postgresql update op is very very slow

From: "Heikki Linnakangas" <heikki(at)enterprisedb(dot)com>
To: "jay" <jackem(dot)mojx(at)alibaba-inc(dot)com>
Cc: <pgsql-performance(at)postgresql(dot)org>
Subject: Re: Postgresql update op is very very slow
Date: 2008-06-25 10:11:02
Message-ID: (view raw, whole thread or download thread mbox)
Lists: pgsql-performance
jay wrote:
> I've a table with about 34601755 rows ,when I execute 'update msg_table set
> type=0;' is very very slow, cost several hours, but still not complete?
> Why postgresql is so slowly? Is the PG MVCC problem? 

Possibly. Because of MVCC, a full-table update will actually create a 
new version of each row.

I presume that's a one-off query, or a seldom-run batch operation, and 
not something your application needs to do often. In that case, you 
could drop all indexes, and recreate them after the update, which should 
help a lot:

DROP INDEX <index name>, <index name 2>, ...; -- for each index
UPDATE msg_table SET type = 0;
CREATE INDEX ... -- Recreate indexes

Or even better, instead of using UPDATE, do a SELECT INTO a new table, 
drop the old one, and rename the new one in its place. That has the 
advantage that the new table doesn't contain the old row version, so you 
don't need to vacuum right away to reclaim the space.

Actually, there's an even more clever trick to do roughly the same thing:


(assuming type is int4, replace with the actual data type if necessary)

This will rewrite the table, similar to a DROP + CREATE, and rebuild all 
indexes. But all in one command.

   Heikki Linnakangas

In response to


pgsql-performance by date

Next:From: HenrikDate: 2008-06-25 10:16:10
Subject: Hardware suggestions for high performance 8.3
Previous:From: NikhilsDate: 2008-06-25 08:33:36
Subject: Re: PostgreSQL and Ruby on Rails - better accessibility

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