由于SQL Server 2005上的循环游标的存储过程必须每小时运行一次,运行时间大约需要5分钟,但占用大量处理器时间:WAITFOR命令
编辑:我会删除光标,如果我可以,不幸的是,我必须做一堆处理和运行基于行的其他存储特效/查询。
我可以在每次读取之前使用 WAITFOR DELAY'0:0:0.1' 充当.Net的Thread.Sleep的SQL版本吗?从而允许其他进程以此过程的执行时间为代价更快地完成。
还是有另一种解决方案,我没有看到?
谢谢
由于SQL Server 2005上的循环游标的存储过程必须每小时运行一次,运行时间大约需要5分钟,但占用大量处理器时间:WAITFOR命令
编辑:我会删除光标,如果我可以,不幸的是,我必须做一堆处理和运行基于行的其他存储特效/查询。
我可以在每次读取之前使用 WAITFOR DELAY'0:0:0.1' 充当.Net的Thread.Sleep的SQL版本吗?从而允许其他进程以此过程的执行时间为代价更快地完成。
还是有另一种解决方案,我没有看到?
谢谢
把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
我不确定这是否能解决问题。恕我直言,游标的性能问题在于用于保持数据集驻留和循环的内存数量,如果您在循环内添加了waitfor,那么您需要更长时间地占用资源。
但是我在这里可能是错的,我建议的是使用perfmon在两种情况下检查服务器的性能,然后决定是否值得 - 添加等待。
看着这个标签,我假设你使用的是MS SQL Server,而不是其他任何风格。
您可以延迟该过程,但这可能会或可能不会帮助您。这取决于程序的工作方式。它是在一个事务中,为什么一个游标(在SQL Server中非常低效),放慢的地方等等。也许重新编写这个过程会更有意义。
自从SQL 2005包含窗口函数和其他整洁的功能以来,我几乎可以在所有实例中消除游标。也许你的问题最好通过消除游标本身来实现?
绝对退房排名功能http://msdn.microsoft.com/en-us/library/ms189798.aspx和总结窗函数http://msdn.microsoft.com/en-us/library/ms189461.aspx
我在猜测,无论你有什么代码,都意味着其他进程无法访问你的光标所来源的表。
假设您将光标设为READONLY FASTWORD,您不应该锁定光标所源自的表格。
但是,如果您需要编写,那么WAITFOR将无济于事。一旦你锁定了桌子,它就被锁定了。
一个选项是将表快照到一个临时表中,然后用cursor/loop代替它。然后,您不会锁定底层表格,但同样地,表格可能会在您处理快照时发生变化...
Dems