微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在不使用新表的情况下删除大量重复记录

如何解决在不使用新表的情况下删除大量重复记录

现在我有一个表,其中包含大量需要删除的重复项(大约 5 亿个)。

我有一个查询删除所有重复项,但由于事务日志被填满而无法完成整个查询

将非重复项移动到新表,然后重命名它,会起作用,但在这种情况下,我无法这样做。这将在生产环境中执行,所以我不能删除那个 d1 表。

与涉及更改某种备份事务日志设置的其他解决方案相同。

这是我的查询

;WITH CTE AS 
(
    SELECT 
        d_id,d_record,d_d2id,ROW_NUMBER() OVER (PARTITION BY d_record,d_d2id ORDER BY d_id) RowNumber
    FROM 
        d1
    WHERE 
        d_d2id >= 25 AND d_d2id <= 28
)
DELETE FROM CTE 
WHERE RowNumber > 1

显然这会起作用,但是由于必须执行的删除量很大,它会炸毁事务日志。

有没有办法创建这个特定的 CTE,然后分批处理 1000 条记录并以这种方式删除它们,从而留下一大堆事务而不是 1 个?或者我还有其他方法可以做到这一点吗?我唯一的解决方案是遍历这些重复项并删除它们,而不会炸毁事务日志。

谢谢!

解决方法

您可以使用游标批量删除。这些通常被认为是不好的做法,但它可以完成您在此处尝试做的事情。

https://www.mysqltutorial.org/mysql-cursor/

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql

,

有两个选项

1st,让系统记忆1个出现的记录位置并删除其余相同值的条目

第二次看到您可以扫描和删除具有 2 个或更多条件的条目,但它必须将您的数据存储在某处, 制作具有唯一/主要约束的临时表要快得多,否则系统可能会在操作时崩溃或变慢,例如在第 1 个找到的记录 RD002,但系统必须记住第一个条目的位置并扫描表的其余部分 > 与其他重复项相同和唯一条目(删除其他条目也会出现同样的情况)

,

可以批量删除1000行,每次删除后提交。您可以在 pl/sql 循环中执行此操作:

begin
    loop

        delete from d1
        where d1.rowid in (
            select t.rowid
            from (
                select 
                    d1.rowid,row_number() over (partition by d_record,d_d2id order by d_id) rn
                from d1
                where 
                    d_d2id >= 25 and d_d2id <= 28
            ) t
            where t.rn > 1 and rownum <= 1000
        );

        commit;
    exit when sql%rowcount = 0;
    end loop;
end;
,

在 SQL Server 中,可以批量删除。虽然这不是最高效的代码,但它说明了批量删除的想法:

DECLARE @go_on INT
SELECT @go_on = 1;

WHILE (@go_on = 1)
BEGIN
    WITH TODELETE AS (
          SELECT TOP (10000) d1.*
          FROM (SELECT d1.*,ROW_NUMBER() OVER (PARTITION BY d_record,d_d2id ORDER BY d_id) as seqnum
                FROM d1
                WHERE d_d2id >= 25 AND d_d2id <= 28
               ) d1
          WHERE seqnum > 1
         )
    DELETE FROM TODELETE; 

    SET @go_on = (CASE WHEN @@ROWCOUNT > 0 THEN 1 ELSE 0 END);
END;

将要删除的行存储在临时表或表变量中会更有效率,这样就不需要每次都重新计算。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。