6

我们有一个包含大约 150 万条记录的表。该表与来自不同表的许多 FK 关系。

问题是 100 万条记录只是必须删除的重复项。我们当时尝试删除 1000 条记录,但这是一个非常缓慢的过程。

我的想法是将必须保留的临时记录复制到新表中。截断现有的并复制必须保留的记录。恢复主键和与其他表的所有关系。所以从客户端你看不出有什么区别。

不确定这是否是一种有效的方式。

如果是的话,我很想看到它的基本实现,这样我就可以遵循并申请我的案例。如果不是,我希望看到有效的方法。

谢谢

4

2 回答 2

2

我们公司有一堆临时数据存储在数据库中。当我们需要删除一堆时,我们将其分成几百行并一次删除它们。我们有一个应用程序,它的唯一目的是一遍又一遍地运行一些这样的查询:

with topFew as (select top 100 * from table) delete topFew

我建议你做一个像这样简单的东西,让它运行几个小时。在处理过程中去做其他事情。

于 2013-06-29T17:18:57.263 回答
1

删除的性能可以通过使用 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;

删除级联也会清理您的子表..

于 2013-07-09T14:19:01.670 回答