SQL Server删除性能

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):超时已过期.操作完成之前经过的超时时间或服务器没有响应.

我是否可以对提高性能进行一般性更改?我很欣赏有许多与我们的数据库模式设计有关的未知数,但欢迎一般的最佳实践建议!我考虑过将这项任务安排在凌晨运行,以尽量减少影响,但这远非理想,因为在完成此任务之前,用户将无法重新获得对其帐户的访问权限.

附加信息:

  • SQL Server 2008 R2标准版
  • 所有表都有聚簇索引
  • 没有任何触发器与任何相关表上的任何删除命令相关联
  • 外键引用存在于许多表中,但删除顺序说明了这一点.

编辑:格林尼治标准时间16:52

删除过程会影响大约20个表.最大的一个有大约500万条记录.其他人不再有200,000,其中一些仅包含1000-2000条记录.

mar*_*c_s 4

accountNumber您在所有表中都有索引吗?

看到您使用WHERE该列的子句进行删除,这可能会有所帮助。

另一种选择(可能甚至更好的解决方案)是在晚上安排删除操作,例如,当用户选择删除他的帐户时,您只需设置一个标志,删除作业在晚上运行,实际删除那些标记为删除的帐户。