我在一个不断增加行的表上运行一个清理工作(每小时)。这项工作运行了大约一个星期没有任何问题。今天我看到工作开始锁定整个表。
这是预期的行为吗?可能是在需要删除的特定行之后,它会锁定整个表而不是只锁定需要删除的特定行?
提前致谢 !
Roy*_*tus 12
如果您的查询影响同一个表中的 5000 行或更多行,则该表将在操作期间被锁定。这是标准的 SQL Server 行为。基本上,每个 DELETE 都会导致该行上有一个锁,同一个表上的每 5000 个行锁会导致从行到表的锁升级。
一种可能性是您需要索引您在表中搜索要删除的行所依据的列。如果您没有索引,则 SQL Server 在搜索要删除的行时将获得更多的锁。
我强烈建议删除循环中的小块行。正如其他人指出的那样,如果您尝试一次删除大约 5,000 多行,SQL Server 会将行锁升级为表锁。一次删除较少的记录(例如 1,000 条)可避免锁定整个表。您的工作可以继续循环删除,直到完成。
循环删除的伪代码如下所示:
declare @MoreRowsToDelete bit
set @MoreRowsToDelete = 1
while @MoreRowsToDelete = 1
begin
delete top (1000) MyTable from MyTable where MyColumn = SomeCriteria
if not exists (select top 1 * from MyTable where MyColumn = SomeCriteria)
set @MoreRowsToDelete = 0
end
Run Code Online (Sandbox Code Playgroud)
或者,您可以查看@@ROWCOUNT
并使用READPAST
提示来避免锁定行:
declare @RowCount int
set @RowCount = 1 -- priming the loop
while @RowCount > 0
begin
delete top (1000) MyTable from MyTable with (readpast) where MyColumn = SomeCriteria
set @RowCount = @@ROWCOUNT
end
Run Code Online (Sandbox Code Playgroud)
请注意,锁升级阈值取决于其他因素,例如并发活动。如果您经常有如此多的活动,即使是 1,000 次删除也会升级为表锁,您可以减少一次删除的行数。
归档时间: |
|
查看次数: |
17092 次 |
最近记录: |