在TSQL中删除数百万条记录的最佳方法是什么?

Dav*_*vid 4 sql t-sql sql-server

我有一个下表结构

Table1       Table2        Table3
--------------------------------
 sId          sId           sId
 name          x              y
  x1          x2             x3
Run Code Online (Sandbox Code Playgroud)

我想删除table1中基于sId在table3中没有匹配记录的所有记录,如果表2中存在sId,则不删除table1.Ther中的记录,表1中包含大约20,15和10百万条记录,表2& table3 resp. - 我做过这样的事情

Delete Top (3000000)
        From Table1 A
        Left Join Table2 B
        on A.Name ='XYZ' and
           B.sId = A.sId
        Left Join Table3 C
        on A.Name = 'XYZ' and
           C.sId = A.sId
Run Code Online (Sandbox Code Playgroud)

((我在sId上添加了索引但不在名称上添加.)) 但这需要很长时间才能删除记录.有没有更好的方法来删除数百万条记录?提前致谢.

SQL*_*ace 10

如果您需要删除少于40%的数据,则需要批量处理5000或10000,如果您需要更多,然后将要保留的内容转储到另一个表/ bcp中,请截断此表并插入您转储的行另一个表再次/ bcp in

while @@rowcount > 0
begin
Delete Top (5000)
        From Table1 A
        Left Join Table2 B
        on A.Name ='XYZ' and
           B.sId = A.sId
        Left Join Table3 C
        on A.Name = 'XYZ' and
           C.sId = A.sId
end
Run Code Online (Sandbox Code Playgroud)

您可以运行的小例子来看看会发生什么

CREATE TABLE #test(id INT)

INSERT #test VALUES(1)
INSERT #test VALUES(1)
INSERT #test VALUES(1)
INSERT #test VALUES(1)
INSERT #test VALUES(1)
INSERT #test VALUES(1)
INSERT #test VALUES(1)

WHILE @@rowcount > 0
BEGIN 
DELETE TOP (2) FROM #test

END 
Run Code Online (Sandbox Code Playgroud)