的SQL Server 2008R2查询拖延
我有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);
你将需要删除的记录数分成多个呼叫
例子:
删除每1000行单独
DELETE FROM TableA
WHERE TableA.ID IN (SELECT TOP (1000) ID FROM TableA)
并且您可以对它们进行循环并检查@@ ROWS_COUNT是否为0那么所有的行都被删除并且不需要召回或IF @@ ROWS_COUNT < 1000那么不需要召回
大查询需要很多事务日志资源(DatabaseName_Log.mdb文件不是数据库文件),并且当你分割您将从较低的资源和较低的日志中受益,从而允许按较小数量的记录更快地执行删除操作
这并没有考虑到'AND TableA.EVDATE ='20170720''的需要。我尝试了你的建议,但在00:02:00它仍在运行。 – Tym
这是错误的。每次子查询都可以返回已经删除的相同的1000条记录! –
我认为最好创建一个存储过程来增加顶端(1000)。或专门删除数据。 –
仅当**需要**时才使用括号。不必要的括号会使代码笨拙并且难以理解 –
在'TableA.ID'和'TableA.EVDATE'上创建索引将有助于查询的运行速度更快。 –
同时加入而不是使用'IN'可能会更快,您需要尝试。 –