QFD*_*Dev 5 sql sql-server performance stored-procedures sql-server-2008-r2
我在.NET Web应用程序中有一个例程,允许我们平台上的用户清除他们的帐户(即删除他们的所有数据).此例程在存储过程中运行,并基本上遍历相关数据表并清除它们创建的所有各种项目.
存储过程看起来像这样.
ALTER procedure [dbo].[spDeleteAccountData](
@accountNumber varchar(30) )
AS
BEGIN
SET ANSI_NULLS ON ;
SET NOCOUNT ON;
BEGIN TRAN
BEGIN TRY
DELETE FROM myDataTable1 WHERE accountNumber = @accountNumber
DELETE FROM myDataTable2 WHERE accountNumber = @accountNumber
DELETE FROM myDataTable3 WHERE accountNumber = @accountNumber
//Etc.........
END TRY
BEGIN CATCH
//CATCH ERROR
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
SET ANSI_NULLS OFF;
SET NOCOUNT OFF;
END
Run Code Online (Sandbox Code Playgroud)
问题是,在某些情况下,我们可以在一张桌子上拥有超过10,000行,并且该过程最多可能需要3-5分钟.在此期间,数据库上的所有其他连接都会受到限制,导致如下所示的超时错误:
System.Data.SqlClient.SqlException(0x80131904):超时已过期.操作完成之前经过的超时时间或服务器没有响应.
我是否可以对提高性能进行一般性更改?我很欣赏有许多与我们的数据库模式设计有关的未知数,但欢迎一般的最佳实践建议!我考虑过将这项任务安排在凌晨运行,以尽量减少影响,但这远非理想,因为在完成此任务之前,用户将无法重新获得对其帐户的访问权限.
附加信息:
编辑:格林尼治标准时间16:52
删除过程会影响大约20个表.最大的一个有大约500万条记录.其他人不再有200,000,其中一些仅包含1000-2000条记录.
accountNumber您在所有表中都有索引吗?
看到您使用WHERE该列的子句进行删除,这可能会有所帮助。
另一种选择(可能甚至更好的解决方案)是在晚上安排删除操作,例如,当用户选择删除他的帐户时,您只需设置一个标志,删除作业在晚上运行,实际删除那些标记为删除的帐户。