gpt4 book ai didi

sql-server-2008 - 在 SQL Server 存储过程中使用游标的替代方法

转载 作者:行者123 更新时间:2023-12-04 18:47:07 24 4
gpt4 key购买 nike

这并不是说我在执行包含在存储过程中的游标时遇到问题。但我想找到更有效的方法来实现相同的目标。

就到这里了。

存储过程: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

同样,我还有 10 个 SET WHERE 上不同的陈述条件参数和字符串包含在 @RawFeed 中多变的。

对于我得到的每一行,我在该特定行上执行另一个存储过程。

我的问题是

Is there any better way to achieve the same without using cursors?



变量@ RawFeed包含以下内容 string这是 usp_pushRawDataAndProcess 的输入存储过程。现在这将分割整个字符串并执行一些操作,例如 INSERT,UPDATE,DELETE在一些 table 上。

我们只能在 usp_pushRawDataAndProcess 中处理超过 1 个字符串
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

最佳答案

与其他关系数据库一样,SQL Server 旨在并且非常擅长处理数据集。

数据库不擅长在查询处理引擎中隐藏所有优化机会的过程代码。

使用 RawStatusFeed存储一些专有请求字符串,然后一一处理这些字符串的列表,对于数据库代码来说将是低效的。这可能会使客户端的插入速度非常快,这可能非常重要,但它是有代价的。

如果您在插入时分解请求字符串,或者更好的是,在通过专门的 SP 调用插入之前,那么您可以将所需的更改存储在某个中间关系模型中,而不是字符串列表中。然后,每隔一段时间,您就可以通过一次调用存储过程立即处理所有更改。诚然,该存储过程包含多个查询语句可能是有意义的。但是,使用正确的索引和统计信息,查询处理引擎将能够为这个新存储过程制定有效的执行计划。

如何实现这一点的确切细节取决于 RawStatusFeed 的确切细节。表和执行usp_pushRawDataAndProcess .虽然这看起来像是重写,但我不认为 DeviceCode列就是那么复杂。

所以,简短的回答肯定是肯定的,但是,我需要知道什么 usp_pushRawDataAndProcess做的很详细。
usp_pushRawDataAndProcess的签名SP 正在充当瓶颈。

如果不能改usp_pushRawDataAndProcess并且不会创建基于集合的替代方案,那么您就会陷入瓶颈。

因此,与其消除瓶颈,不如采取另一种方式。为什么不制作更多的瓶颈并发实例来提供数据。

如果您使用的是 SQL Server 2005 或更高版本,您可以使用一些 CLR 来执行 usp_pushRawDataAndProcess 的大量实例。在平行下。

Here is a link到我以前用来做类似事情的项目。

关于sql-server-2008 - 在 SQL Server 存储过程中使用游标的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12600265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com