我需要删除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;
我想知道是否可以优化该查询以提高删除性能
谢谢。
答案 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作为谓词从实际表中删除。