我似乎无法弄清楚为什么对我的一个表执行一个简单的DELETE命令需要这么长时间。我的意思是1:30。
查询如下:
DELETE FROM Users WHERE UserID = @UserID AND UserName = ''
当然不是那么简单。 Users
表通过UserID
列上的外键与许多其他表有关系。其中一些表又与其他表有关系,因此,在从Users
表中删除之前,我必须确保删除对这些其他表中所讨论的行的所有引用,并且在删除这些行之前,必须删除其他表中对它们的所有引用。
我不使用级联删除,但我在上面的命令之前有一个SQL命令列表,看起来像这样:
DELETE FROM ThisTable
WHERE ThisField IN (SELECT ThisField FROM OtherTable WHERE UserID = @UserID);
DELETE FROM ThatTable
WHERE ThatField IN (SEECT ThatField FROM OtherTable WHERE UserID = @UserID);
DELETE FROM OtherTable WHERE UserID = @UserID;
仅此而已,但我所知道的是,当所有这些查询都已执行时,@UserID
的任何相关表中都没有Users
的引用。我知道这是因为DELETE
没有失败,只需要很长时间,我似乎无法弄清楚原因。 Users
表格不是特别庞大,大约有11K行。
我附上了估计的执行计划,如果它有用的话。真的很感激一些想法。我可以使用哪些其他工具来确定我非常简单的查询中耗时的部分?
答案 0 :(得分:2)
当您尝试删除记录时,数据库引擎必须实际检查您是否正在尝试删除任何外键中引用的主键(并删除那些具有级联删除的FK)。您应该在所有外键上有索引或它们各自的查找将导致慢速表扫描。
如果同一个数据库中还有其他活动用户,则他们可以在任何次要表上锁定长时间删除块。
答案 1 :(得分:0)
我宁愿使用连接来做这件事。如果可以,请添加适当的索引,否则如果索引是问题,您甚至可以考虑添加表变量,然后使用它们进行最终删除。 Alt查询如下:
DELETE FROM ThisTable
FROM
ThisTable
inner join OtherTable
OtherTable
on
ThisTable.UserId = OtherTable.UserId
where
OtherTable.UserId = @UserID
DELETE FROM ThatTable
FROM
ThatTable
inner join OtherTable
OtherTable
on
ThatTable.UserId = OtherTable.UserId
where
OtherTable.UserId = @UserID
DELETE FROM OtherTable
WHERE
UserID = @UserID;