我有2个表,TableA和TableB
TableA包含近3,000,000条记录 TableB包含大约10,000条记录
我想删除TableA中与某些参数匹配的条目。对于较小的表,此查询已正常运行,但在VB.Net中运行时出现超时异常
delete FROM TableA WHERE (((TableA.ID) In (SELECT [TableB].ID FROM TableB)) AND ((TableA.EVDATE)='20170720'));
为了了解发生了什么,我在SSMS中将其更改为SELECT * FROM ...并且在5分钟内没有结果,我停止了...
为什么这种情况会停滞不前,有没有更好的方法呢?
我认为这样做要好得多:
delete FROM TableA WHERE TableA.EVDATE='20170720' and TableA.ID In
(SELECT [TableB].ID FROM TableB);
答案 0 :(得分:0)
您需要将已删除记录的数量分成多个调用
示例:
单独删除每1000行
DELETE FROM TableA
WHERE TableA.ID IN (SELECT TOP (1000) ID FROM TableA)
你可以对它们进行循环并检查@@ ROWS_COUNT如果为0则所有行都被删除,无需召回或IF @@ ROWS_COUNT< 1000然后无需回忆
大查询需要大量的事务日志资源(DatabaseName_Log.mdb文件而不是数据库文件),当你拆分时,你将受益于更低的资源和更低的日志,这允许更快的执行每个较小数量的记录删除