我在我们的.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
问题在于有些情况下,我们的表格可能会有超过10,000行,而该过程可能需要3-5分钟。在此期间,数据库上的所有其他连接都会被限制,导致类似以下错误的超时错误:
System.Data.SqlClient.SqlException (0x80131904):操作完成之前超时或服务器无响应。
有没有一般性的更改可以提高性能?我知道与我们数据库架构的设计相关的未知因素很多,但是一般的最佳实践建议将受到欢迎!我考虑安排这个任务在凌晨运行以最小化影响,但这远非理想,因为用户在此任务完成之前将无法重新访问其帐户。
附加信息:
SQL Server 2008 R2标准版 所有表格都有聚集索引 没有触发器与任何相关表的删除命令相关联 外键引用存在于多个表上,但删除顺序已经考虑到了这一点。
编辑:16:52 GMT
删除proc影响约20个表格。最大的表格大约有500万条记录。其他表格没有超过200,000条记录,其中一些只包含1000-2000条记录。