2008-09-17 39 views
5

由于SQL Server 2005上的循环游标的存储过程必须每小时运行一次,运行时间大约需要5分钟,但占用大量处理器时间:WAITFOR命令

编辑:我会删除光标,如果我可以,不幸的是,我必须做一堆处理和运行基于行的其他存储特效/查询。

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

还是有另一种解决方案,我没有看到?

谢谢

回答

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

我不确定这是否能解决问题。恕我直言,游标的性能问题在于用于保持数据集驻留和循环的内存数量,如果您在循环内添加了waitfor,那么您需要更长时间地占用资源。

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

看着这个标签,我假设你使用的是MS SQL Server,而不是其他任何风格。

0

您可以延迟该过程,但这可能会或可能不会帮助您。这取决于程序的工作方式。它是在一个事务中,为什么一个游标(在SQL Server中非常低效),放慢的地方等等。也许重新编写这个过程会更有意义。

0

我在猜测,无论你有什么代码,都意味着其他进程无法访问你的光标所来源的表。

假设您将光标设为READONLY FASTWORD,您不应该锁定光标所源自的表格。

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

一个选项是将表快照到一个临时表中,然后用cursor/loop代替它。然后,您不会锁定底层表格,但同样地,表格可能会在您处理快照时发生变化...

Dems