Oh, sorry, overlooked that part. Maybe refreshing stats with VACUUM FULL ?
2013/5/17 Robert Emery <robertem...@codeweavers.net> > Hi Sékine, > > Unfortunately I'm not trying to empty the table completely, just > delete about 10-15% of the data in it. > > Thanks, > > On 17 May 2013 14:11, Sékine Coulibaly <scoulib...@gmail.com> wrote: > > Rob, > > > > Did you tried TRUNCATE ? > > http://www.postgresql.org/docs/8.4/static/sql-truncate.html > > > > This is is supposed to be quicker since it does scan the table. > > > > Regards > > > > > > 2013/5/17 Rob Emery <re-pg...@codeweavers.net> > >> > >> Hi All, > >> > >> We've got 3 quite large tables that due to an unexpected surge in > >> usage (!) have grown to about 10GB each, with 72, 32 and 31 million > >> rows in. I've been tasked with cleaning out about half of them, the > >> problem I've got is that even deleting the first 1,000,000 rows seems > >> to take an unreasonable amount of time. Unfortunately this is on quite > >> an old server (Dell 2950 with a RAID-10 over 6 disks) running Postgres > >> 8.4; which serves other things like our logging systems. > >> > >> If I run a sustained (more than about 5 minutes) delete it'll have a > >> detrimental effect on the other services. I'm trying to batch up the > >> deletes into small chunks of approximately 1 month of data ; even this > >> seems to take too long, I originally reduced this down to a single > >> day's data and had the same problem. I can keep decreasing the size of > >> the window I'm deleting but I feel I must be doing something either > >> fundamentally wrong or over-complicating this enormously. I've > >> switched over to retrieving a list of IDs to delete, storing them in > >> temporary tables and deleting based on the primary keys on each of the > >> tables with something similar to this: > >> > >> BEGIN TRANSACTION; > >> > >> CREATE TEMPORARY TABLE table_a_ids_to_delete (id INT); > >> CREATE TEMPORARY TABLE table_b_ids_to_delete (id INT); > >> > >> INSERT INTO table_a_ids_to_delete > >> SELECT id FROM table_a WHERE purchased ='-infinity' AND created_at > >> < '2007-01-01T00:00:00'; > >> > >> INSERT INTO table_b_ids_to_delete > >> SELECT table_b_id FROM table_a_table_b_xref > >> INNER JOIN table_a_ids_to_delete ON (table_a_ids_to_delete.id = > >> table_a_table_b.quote_id); > >> > >> DELETE FROM table_a_table_b_xref USING table_a_ids_to_delete > >> WHERE table_a_table_b_xref.table_a_id = table_a_ids_to_delete.id; > >> > >> DELETE FROM table_b USING table_b_ids_to_delete > >> WHERE table_b.id = table_b_ids_to_delete.id; > >> > >> DELETE FROM table_a USING table_a_ids_to_delete > >> WHERE table_a.id = table_a_ids_to_delete.id; > >> > >> COMMIT; > >> > >> There're indices on table_a on the queried columns, table_b's primary > >> key is it's id, and table_a_table_b_xref has an index on (table_a_id, > >> table_b_id). There're FK defined on the xref table, hence why I'm > >> deleting from it first. > >> > >> Does anyone have any ideas as to what I can do to make the deletes any > >> faster? I'm running out of ideas! > >> > >> Thanks in advance, > >> > >> -- > >> Rob Emery > >> > >> > >> -- > >> Sent via pgsql-performance mailing list ( > pgsql-performance@postgresql.org) > >> To make changes to your subscription: > >> http://www.postgresql.org/mailpref/pgsql-performance > > > > > > > > -- > Robert Emery > Database Administrator > > | T: 0800 021 0888 | www.codeweavers.net | > | Codeweavers Limited | Barn 4 | Dunston Business Village | Dunston | ST18 > 9AB | > | Registered in England and Wales No. 04092394 | VAT registration no. > 974 9705 63 | > > CUSTOMERS' BLOG TWITTER FACEBOOK LINKED IN > DEVELOPERS' BLOG YOUTUBE >