我们有一个包含大约 150 万条记录的表。该表与来自不同表的许多 FK 关系。
问题是 100 万条记录只是必须删除的重复项。我们当时尝试删除 1000 条记录,但这是一个非常缓慢的过程。
我的想法是将必须保留的临时记录复制到新表中。截断现有的并复制必须保留的记录。恢复主键和与其他表的所有关系。所以从客户端你看不出有什么区别。
不确定这是否是一种有效的方式。
如果是的话,我很想看到它的基本实现,这样我就可以遵循并申请我的案例。如果不是,我希望看到有效的方法。
谢谢
我们有一个包含大约 150 万条记录的表。该表与来自不同表的许多 FK 关系。
问题是 100 万条记录只是必须删除的重复项。我们当时尝试删除 1000 条记录,但这是一个非常缓慢的过程。
我的想法是将必须保留的临时记录复制到新表中。截断现有的并复制必须保留的记录。恢复主键和与其他表的所有关系。所以从客户端你看不出有什么区别。
不确定这是否是一种有效的方式。
如果是的话,我很想看到它的基本实现,这样我就可以遵循并申请我的案例。如果不是,我希望看到有效的方法。
谢谢
我们公司有一堆临时数据存储在数据库中。当我们需要删除一堆时,我们将其分成几百行并一次删除它们。我们有一个应用程序,它的唯一目的是一遍又一遍地运行一些这样的查询:
with topFew as (select top 100 * from table) delete topFew
我建议你做一个像这样简单的东西,让它运行几个小时。在处理过程中去做其他事情。
删除的性能可以通过使用 rowid 自连接表来提高。它甚至可以通过使用批量收集和 FORALL 进行优化
DECLARE
limit_in integer;
CURSOR C1 is
Select min(b.rowid)
from table_name a, table_name b
where a.primary_key = b.primary_key;
TYPE C1_rec IS TABLE OF C1%ROWTYPE
INDEX BY PLS_INTEGER;
C1_record C1_rec
BEGIN
limit_in:=10000 --- Can be changed based on performance
OPEN C1;
LOOP
FETCH C1 BULK COLLECT INTO C1_record LIMIT limit_in;
FORALL indx in 1..c1_record.count
DELETE FROM table_name where row_id = C1_record(i);
commit;
END LOOP;
END;
待删除的表有子表,所以会有约束违规。
所以在执行上面这段代码之前,将外键约束修改为 HAVE DELETE CASCADE 是一个更好的选择。我们不能修改约束来添加删除级联。所以应该删除外键并重新创建以删除级联
ALTER child_table
ADD CONSTRAINT fk_name
foreign_key (C1)
references parent_table (C2) on delete cascade;
删除级联也会清理您的子表..