SQL Server 2008R2查询停滞

时间:2017-08-04 06:34:48

标签: sql-server vb.net sql-server-2008-r2

我有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);

1 个答案:

答案 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文件而不是数据库文件),当你拆分时,你将受益于更低的资源和更低的日志,这允许更快的执行每个较小数量的记录删除