11

我试图找出 T-SQL 中 WAITFOR 的性能或内部实现,已经通过MSDN和 Stackoverflow 和其他网站没有运气,这是我的问题

对于下面的代码,我想从 table 中删除前 10,000 行DUMMY。我想让这个删除作业对数据库的其他作业的性能影响尽可能小,并优先考虑其他作业(如果有的话)。所以我让它一次删除 100 行,并在两个相邻的删除中使用睡眠时间执行 100 次。

问题:

  1. WAITFOR阻塞时间内,该事务会消耗 CPU 还是只是空闲并等待 1 秒后某个事件启动?

  2. 在那 1 秒内,如果有其他事务试图INSERT/UPDATEDUMMY表,谁获得优先权?

非常感谢您的帮助或对此的任何见解

declare @cnt int 
set @cnt = 0
while @cnt < 100
begin
  delete top 100 from DUMMYTABLE where FOO = 'BAR'
  set @cnt = @cnt + 1
  waitfor delay '00:00:01'
end
4

1 回答 1

22
  • 它不消耗任何CPU
  • 状态 = 暂停

您可以通过 2 个查询窗口看到这一点:

SELECT @@SPID;
GO
WAITFOR DELAY '000:03:00'; -- three minutes

然后在另一个

SELECT * FROM sys.sysprocesses S WHERE S.spid = 53; -- replace 53

注意:SQL Server 2012 SP1 但 AFAIK 行为相同

第2点,抱歉错过了

另一个会话将在 WAITFOR 运行时修改表。这不是锁。

于 2013-05-23T14:32:51.777 回答