删除SQL Server上的大量数据

时间:2019-12-05 12:56:04

标签: sql-server tsql sql-delete

我需要删除SQL Server中的9000亿条记录。

我想知道最好的方法。

我做了以下选择。

DeleteTable: 
   DELETE TOP(1000)  TAB1 
   FROM TABLE1 TAB1 
     LEFT JOIN TABLE2 TAB2 ON TAB1.ID_PRODUCT = AB2.ID_PRODUCT 
   WHERE TAB2.ID_PRODUCT IS NULL; 
   IF @@ROWCOUNT <> 0 goto DeleteTable; 

我想知道是否可以优化该查询以提高删除性能

谢谢。

2 个答案:

答案 0 :(得分:4)

这个评论太长了。

删除900,000,000行将需要很长时间,并且您可能会用完临时存储-除非您有很多存储。您采用一种方法递增删除行的方法。

如果您的日志记录未设置为“简单”,则可能需要考虑这一点。使用增量删除方法,至少可以防止日志填满。

对于您的查询,您希望tab2(id_product)有一个索引。我不确定tab1(id_product)上的索引是否真的有帮助。

另一种方法是重新创建表,因为insert和表创建效率更高。

为此,您基本上可以这样做:

select t1.*
into temp_tab1
from tab1 t1 
where exists (select 1 from table2 t2 where t2.id_product = t1.id_product);

truncate table tab1;  -- back it up first!

insert into tab1
    select *
    from temp_tab1;

注意:如果您有一个标识列,则可能要启用标识插入。另外,如果您对该表有 外键约束,则需要格外小心。

最后,如果需要重复执行此操作,则应考虑对表进行分区。删除分区比删除行要有效得多。

答案 1 :(得分:0)

如果数据库是高度事务性的并且表具有大量读写活动,则需要小心,主要是因为在删除过程中,您可能会阻止其他会话。一种较慢但影响较小的方法是使用游标删除记录。做到这一点的方法是将product_id放入#table并使用product_id作为谓词从实际表中删除。

相关问题