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
>

Reply via email to