Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL存储过程-如何优化慢速删除?_Sql_Database_Azure - Fatal编程技术网

SQL存储过程-如何优化慢速删除?

SQL存储过程-如何优化慢速删除?,sql,database,azure,Sql,Database,Azure,我有一个看似简单的存储过程,运行时间太长(在大约100万条记录上运行25分钟)。我想知道我能做些什么来加速它。它只是删除一组给定状态的记录 以下是整个过程: ALTER PROCEDURE [dbo].[spTTWFilters] AS BEGIN DELETE FROM TMW WHERE STATUS IN ('AVAIL', 'CANCL', 'CONTACTED', 'EDI-IN', 'NOFRGHT', 'QUOTE'); END 显然,我可以增强我的Azure

我有一个看似简单的存储过程,运行时间太长(在大约100万条记录上运行25分钟)。我想知道我能做些什么来加速它。它只是删除一组给定状态的记录

以下是整个过程:

ALTER PROCEDURE [dbo].[spTTWFilters]
AS
BEGIN
    DELETE FROM TMW 
    WHERE STATUS IN ('AVAIL', 'CANCL', 'CONTACTED', 'EDI-IN', 'NOFRGHT', 'QUOTE');
END

显然,我可以增强我的Azure SQL实例的运行速度,但还有其他方法可以改进吗?我的语法是否不理想?我需要为状态列编制索引吗?谢谢

因此,与大型数据更新操作的一般情况一样,答案是将其分成几个较小的批

默认情况下,每个DML语句都会启动一个隐式事务,无论是否显式声明。通过在单个批处理中运行影响大量行的delete,在操作期间索引和基表上会保持锁,日志文件将继续增长,从而在内部为整个事务创建新的VLF

此外,如果删除在完成之前中止,回滚可能需要相当长的时间才能完成,因为它们始终是单线程的


分批执行,通常以某种循环形式通过一系列键值逐步执行,允许在更小、更易于管理的块中执行删除。在这种情况下,单独删除一系列不同的状态值似乎足以产生值得改进的效果。

您可以使用top关键字来删除大量数据,方法是使用loop或use=sign而不是In关键字。

您能获得此查询的实际执行计划吗?很可能,为
状态
列编制索引会很有帮助-如果您使用这些状态值限制足够匹配的行数。请将计划粘贴到,并将结果链接发布到您的问题我发布了计划。不过我真的不知道怎么读。如果你觉得有什么特别之处,请提出建议。Thankstory-在这里:听起来你将受益于分几批删除。您可以尝试的一件事是对每个状态进行多次删除,而不是同时进行,这将减少每个事务的日志使用量,最好是在
status