2017-08-04 36 views
0

我有2个表,表A和表B的SQL Server 2008R2查询拖延

表A中包含了惊人的3,000,000记录 表B中含有约10000条记录

我想删除TableA中符合特定参数的条目。此查询的小表qorked OK,但在VB.Net

delete FROM TableA WHERE (((TableA.ID) In (SELECT [TableB].ID FROM TableB)) AND ((TableA.EVDATE)='20170720')); 

运行时在努力,看看发生了什么事情,我得到超时异常,我改变了这一个SELECT * FROM ... SSMS中和在5分钟没有结果,我停止了它...

为什么这个摊位,有没有更好的方式做到这一点?

我觉得这是更好的阅读:

delete FROM TableA WHERE TableA.EVDATE='20170720' and TableA.ID In 
(SELECT [TableB].ID FROM TableB); 
+1

仅当**需要**时才使用括号。不必要的括号会使代码笨拙并且难以理解 –

+3

在'TableA.ID'和'TableA.EVDATE'上创建索引将有助于查询的运行速度更快。 –

+0

同时加入而不是使用'IN'可能会更快,您需要尝试。 –

回答

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文件不是数据库文件),并且当你分割您将从较低的资源和较低的日志中受益,从而允许按较小数量的记录更快地执行删除操作

+0

这并没有考虑到'AND TableA.EVDATE ='20170720''的需要。我尝试了你的建议,但在00:02:00它仍在运行。 – Tym

+1

这是错误的。每次子查询都可以返回已经删除的相同的1000条记录! –

+0

我认为最好创建一个存储过程来增加顶端(1000)。或专门删除数据。 –