Обсуждение: Delete very slow after deletion of many rows in dependent table
Hi,
we saw the following problem:
We deleted all rows from a table B referencing table A (~500000 records). No
problem, but the following try to delete all records from table A (~180000) lead
to a "never ending" statement. We found out, that vacuuming table B after delete
did the trick.
It seems to us the database has to do scan thru deleted records on B while
deleting from A. Why did it last so long? An index on B.a_fk did not lead to
imporvements. The query plan did not help.
Could anybody explain the problem to me? Does anybody know a different solution
than vacuuming the table after big deletes? (We already vaccuum the database
periodically.)
Below the statements to reproduce the problem.
Regards
Cornelius
============================================================
-- create two tables, b references a through a_fk
create table table_a ( a_pk int8 primary key );
create table table_b ( b_pk int8 primary key, a_fk int8 not null references
table_a ( a_pk ) );
-- fill a and b with 100000 records
create or replace function fill_table_a() returns int8 as '
begin
for i in 1..100000 loop
insert into table_a values ( i );
end loop;
return 1;
end' language plpgsql;
select fill_table_a();
insert into table_b ( select a_pk, a_pk from table_a );
commit;
-- delete records from b, so records from a can be also be deleted
delete from table_b;
commit;
-- delete records from a;
-- this delete needs a VERY long time
delete from table_a;
-- we do it again, but vacuum table_b first
-- delete records from b, so records from a can be also be deleted
vacuum table_b;
-- delete records from a;
delete from table_a;
commit;
--
________________________________________________________
Cornelius Buschka
arcus(x) GmbH
Hein-Hoyer-Straße 75 fon: +49 (0)40.333 102 92
D-20359 Hamburg fax: +49 (0)40.333 102 93
http://www.arcusx.com c.buschka AT arcusx DOT com
________________________________________________________
On Sun, 21 Nov 2004, Cornelius Buschka wrote: > Hi, > > we saw the following problem: > > We deleted all rows from a table B referencing table A (~500000 records). No > problem, but the following try to delete all records from table A (~180000) lead > to a "never ending" statement. We found out, that vacuuming table B after delete > did the trick. > > It seems to us the database has to do scan thru deleted records on B while > deleting from A. Why did it last so long? An index on B.a_fk did not lead to > imporvements. The query plan did not help. An index seems to help for me. It's still kinda slow, but the real time for the delete on A goes from more minutes than I was willing to wait to about 19s. However, if you'd already run the key without the index, refilled the table, made the index and tried it again, it probably wouldn't have used the index because it tries to cache the plan on first use in each session (you'd need to start a new session to try again).
Hi Stephan, caching of the execution plan is a good hint. We'll try it in a new connection. Best Regards Cornelius Stephan Szabo wrote: > On Sun, 21 Nov 2004, Cornelius Buschka wrote: > > >>Hi, >> >>we saw the following problem: >> >>We deleted all rows from a table B referencing table A (~500000 records). No >>problem, but the following try to delete all records from table A (~180000) lead >>to a "never ending" statement. We found out, that vacuuming table B after delete >>did the trick. >> >>It seems to us the database has to do scan thru deleted records on B while >>deleting from A. Why did it last so long? An index on B.a_fk did not lead to >>imporvements. The query plan did not help. > > > An index seems to help for me. It's still kinda slow, but the real time > for the delete on A goes from more minutes than I was willing to wait to > about 19s. > > However, if you'd already run the key without the index, refilled the > table, made the index and tried it again, it probably wouldn't have used > the index because it tries to cache the plan on first use in each session > (you'd need to start a new session to try again). > > -- ________________________________________________________ Cornelius Buschka arcus(x) GmbH Hein-Hoyer-Straße 75 fon: +49 (0)40.333 102 92 D-20359 Hamburg fax: +49 (0)40.333 102 93 http://www.arcusx.com mailto:c.buschka@arcusx.com ________________________________________________________