Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 等待命令_Sql Server - Fatal编程技术网

Sql server 等待命令

Sql server 等待命令,sql-server,Sql Server,SQL Server 2005上的一个存储过程(在游标中循环)必须每小时运行一次,运行大约需要5分钟,但会占用大量处理器时间,这是一个问题: 编辑:如果可以的话,我会删除光标,不幸的是,我必须执行一系列处理并基于行运行其他存储过程/查询 我能用吗 等待延迟“0:0:0.1” 在每次提取之前充当.Net的Thread.Sleep的SQL版本?因此,允许以该过程的执行时间为代价更快地完成其他过程 还是我没有看到另一个解决方案 谢谢我不确定这是否能解决问题。我想,游标的性能问题是围绕着保持数据集驻留和

SQL Server 2005上的一个存储过程(在游标中循环)必须每小时运行一次,运行大约需要5分钟,但会占用大量处理器时间,这是一个问题:

编辑:如果可以的话,我会删除光标,不幸的是,我必须执行一系列处理并基于行运行其他存储过程/查询

我能用吗 等待延迟“0:0:0.1” 在每次提取之前充当.Net的Thread.Sleep的SQL版本?因此,允许以该过程的执行时间为代价更快地完成其他过程

还是我没有看到另一个解决方案


谢谢

我不确定这是否能解决问题。我想,游标的性能问题是围绕着保持数据集驻留和循环所使用的内存量,如果在循环中添加waitfor,则占用资源的时间更长

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


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

您可以延迟此过程,但这可能会对您有所帮助,也可能不会对您有所帮助。这取决于程序的工作方式。是在事务中,为什么光标(在SQL Server中效率极低),哪里速度慢,等等。也许重新编写过程会更有意义。

自从SQL 2005包含窗口功能和其他整洁的功能以来,我几乎能够在所有实例中消除光标。也许消除光标本身最能解决您的问题


当然可以查看排名函数和聚合窗口函数

将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
声明@minid int、@maxid int、@somevalue int
选择@minid=1、@maxid=5

当@minid时,我猜想无论您有什么代码,都意味着其他进程无法访问您的游标所派生的表

如果将游标设为只读快捷字,则不应锁定游标派生自的表

然而,如果你需要写信,那么WAITFOR也帮不了你。一旦你锁上了桌子,它就被锁上了

一个选项是将表快照到一个临时表中,然后游标/循环遍历该临时表。这样就不会锁定基础表,但同样地,在处理快照时,这些表可能会更改

DEM