这并不是说我在执行包含在存储过程中的游标时遇到了问题.但我想找到更有效的方法来实现同样的目标.
在这里.
存储过程:( RawFeed.sql每5分钟运行一次)
Set @GetATM = Cursor For
Select DeviceCode,ReceivedOn
From RawStatusFeed
Where CRWR=2 AND Processed=0
Order By ReceivedOn Desc
Open @GetATM
Fetch Next
From @GetATM Into @ATM,@ReceivedOn
While @@FETCH_STATUS = 0
Begin
Set @RawFeed=@ATM+' '+Convert(VarChar,@ReceivedOn,121)+' '+'002307'+' '+@ATM+' : Card Reader/Writer - FAULTY '
Exec usp_pushRawDataAndProcess 1,@RawFeed
Fetch Next
From @GetATM Into @ATM,@ReceivedOn
End
Set @GetATM = Cursor For
Select DeviceCode,ReceivedOn
From RawStatusFeed
Where CRWR=0 AND Processed=0
Order By ReceivedOn Desc
Open @GetATM
Fetch Next
From @GetATM Into @ATM,@ReceivedOn
While @@FETCH_STATUS = 0
Begin
Set @RawFeed=@ATM+' '+Convert(Varchar,@ReceivedOn,121)+' '+'002222'+' '+@ATM+' : Card Reader/Writer - OK '
Exec usp_pushRawDataAndProcess 1,@RawFeed
Fetch Next
From @GetATM Into @ATM,@ReceivedOn
End
Run Code Online (Sandbox Code Playgroud)
同样,我还有10个SET语句WHERE参数和@RawFeed变量中包含的字符串不同.
对于我得到的每一行,我在该特定行上执行另一个存储过程.
我的问题是
没有使用游标,有没有更好的方法来实现相同的目标?
变量@ RawFeed包含以下string输入usp_pushRawDataAndProcess存储过程.现在这将划分整个字符串并INSERT,UPDATE,DELETE在某些表上执行某些操作.
我们不能处理超过1个字符串 usp_pushRawDataAndProcess
NMAAO226 2012-09-22 16:10:06.123 002073 NMAAO226 : Journal Printer - OK
WMUAO485 2012-09-22 16:10:06.123 002222 WMUAO485 : Card Reader/Writer - OK
Run Code Online (Sandbox Code Playgroud)
SQL Server 与其他关系数据库一样,旨在并且非常擅长处理数据集。
数据库不擅长程序代码,因为查询处理引擎掩盖了所有优化的机会。
对于数据库代码来说,使用RawStatusFeed存储一些专有请求字符串,然后逐一处理这些请求字符串的列表将是低效的。这可能会使客户的插入速度非常快,这可能非常重要,但这是有代价的。
如果您在插入时分解请求字符串,或者更好的是在通过专门的 SP 调用插入之前分解请求字符串,那么您可以将所需的更改存储在某些中间关系模型中,而不是字符串列表中。然后,每隔一段时间,您就可以通过调用一个存储过程一次性处理所有更改。诚然,该存储过程包含多个查询语句可能是有意义的。然而,通过正确的索引和统计信息,查询处理引擎将能够为这个新的存储过程制定有效的执行计划。
如何实现这一点的具体细节取决于RawStatusFeed表的具体细节和 的实现usp_pushRawDataAndProcess。虽然这看起来像是重写,但我不认为该DeviceCode专栏那么复杂。
所以,简短的答案当然是肯定的,但是,我需要知道usp_pushRawDataAndProcess详细的内容。
SP的签名usp_pushRawDataAndProcess是一个瓶颈。
如果您无法改变usp_pushRawDataAndProcess并且不会创建基于集合的替代方案,那么您就会陷入瓶颈。
因此,与其消除瓶颈,不如采取另一种策略。为什么不创建更多的瓶颈并发实例来提供数据。
如果您使用的是 SQL Server 2005 或更高版本,您可以使用某些 CLR 并行执行多个实例usp_pushRawDataAndProcess。
这是我之前用来做类似事情的项目的链接。
| 归档时间: |
|
| 查看次数: |
10769 次 |
| 最近记录: |