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)