WAITFOR命令

时间:2008-09-17 12:11:02

标签: sql-server

考虑到SQL Server 2005上的存储过程(循环游标)必须每小时运行一次并且运行大约需要5分钟,但它占用了大量的处理器时间:

编辑:如果可以的话,我会删除光标,不幸的是,我必须做一堆处理并根据该行运行其他存储过程/查询。

我可以使用吗?    WAITFOR DELAY'0:0:0.1' 在每次获取之前充当SQL的.Net的Thread.Sleep版本?因此,允许其他进程以此过程的执行时间为代价更快地完成。

或者是否有另一种我没有看到的解决方案?

由于

5 个答案:

答案 0 :(得分:4)

将WAITFOR放入循环中确实会减慢它的速度,让其他东西更快。您可能还会考虑WHILE循环而不是游标 - 根据我的经验,它运行得更快。您也可以考虑将光标移动到快进的只读光标 - 这可以限制占用的内存量。

declare @minid int, @maxid int, @somevalue int 
select @minid = 1, @maxid = 5
while @minid <= @maxid
begin
  set @somevalue = null
  select @somevalue = somefield from sometable where id = @minid
  print @somevalue
  set @minid = @minid + 1
  waitfor delay '00:00:00.1'
end

答案 1 :(得分:1)

我不确定这是否能解决问题。恕我直言,游标的性能问题是你用来保持数据集驻留并循环通过它的内存量,如果你在循环中添加一个waitfor,你会占用更长时间的资源。

但我可能在这里错了,我建议使用perfmon在两种条件下检查服务器的性能,然后决定是否值得添加等待。

查看标记,我假设您使用的是MS SQL Server,而不是其他任何版本。

答案 2 :(得分:0)

您可以延迟该程序,但这可能会或可能不会对您有所帮助。这取决于程序的工作原理。它是在一个事务中,为什么一个游标(在SQL Server中非常低效),在哪里是减速等等。也许重做这个过程会更有意义。

答案 3 :(得分:0)

自SQL 2005包含窗口函数和其他简洁功能以来,我几乎可以在所有实例中消除游标。也许你的问题最好通过消除光标本身来实现?

绝对查看排名函数http://msdn.microsoft.com/en-us/library/ms189798.aspx和聚合窗口函数http://msdn.microsoft.com/en-us/library/ms189461.aspx

答案 4 :(得分:0)

我猜你所拥有的代码意味着其他进程无法访问你的光标来源的表。

如果你将游标设为READONLY FASTWORD,则不应该锁定从中派生游标的表。

但是,如果你需要写作,那么WAITFOR就无济于事了。一旦你锁定了桌子,它就被锁定了。

一个选项是将表快照到临时表中,然后将游标/循环反过来。然后,您将不会锁定基础表,但在处理快照时,表格可能会发生变化......

民主党