gpt4 book ai didi

sql-server - SQL Server 游标性能缓慢

转载 作者:行者123 更新时间:2023-12-03 02:04:35 26 4
gpt4 key购买 nike

我正在开始在 sql server 2008 的存储过程中第一次使用游标。我已经做了一些初步阅读,并且了解它们具有显着的性能限制。在我当前的情况下,我认为它们是必要的(我想为符号表中的每个股票符号运行多个存储过程。

编辑:我将在每个交易品种上调用的存储过程大部分是插入操作,以计算与交易品种相关的值,例如 5 天移动平均值、平均每日交易量、ATR(平均真实范围)。这些值中的大多数将根据每日定价和交易量表中的数据计算得出...我想简化对数据值的检索,否则这些值将被冗余检索...例如,我想为每个将每日定价和交易量数据符号到表变量中...然后该临时表将被传递到调用我刚才提到的每个聚合函数的存储过程。希望这是有道理的...

所以我最初的基于游标的“外循环”存储过程如下......几分钟后超时,没有将任何内容返回到输出窗口。

ALTER PROCEDURE dbo.sprocSymbolDependentAggsDriver2

AS

DECLARE @symbol nchar(10)
DECLARE symbolCursor CURSOR
STATIC FOR
SELECT Symbol FROM tblSymbolsMain ORDER BY Symbol

OPEN symbolCursor
FETCH NEXT FROM symbolCursor INTO @symbol
WHILE @@FETCH_STATUS = 0
SET @symbol = @symbol + ': Test.'
FETCH NEXT FROM symbolCursor INTO @symbol

CLOSE symbolCursor
DEALLOCATE symbolCursor

当我在没有 @symbol 局部变量的情况下运行它并消除 while 循环中对其的赋值时,它似乎运行正常。该任务中是否存在明显违反绩效最佳实践的情况?谢谢..

最佳答案

"In my current case I think they're necessary (I want to run multiple stored procedures for each stock symbol in a symbols table."

很少需要游标。

从上面的示例中,我认为一个简单的 WHILE 循环将轻松取代光标。改编自SQL Cursors - How to avoid them (我最喜欢的 SQL 书签之一)

-- Create a temporary table...
CREATE TABLE #Symbols (
RowID int IDENTITY(1, 1),
Symbol(nvarchar(max))
)
DECLARE @NumberRecords int, @RowCount int
DECLARE @Symbol nvarchar(max)

-- Get your data that you want to loop over
INSERT INTO #Symbols (Symbol)
SELECT Symbol
FROM tblSymbolsMain
ORDER BY Symbol

-- Get the number of records you just grabbed
SET @NumberRecords = @@ROWCOUNT
SET @RowCount = 1


-- Just do a WHILE loop. No cursor necessary.
WHILE @RowCount <= @NumberRecords
BEGIN
SELECT @Symbol = Symbol
FROM #Symbols
WHERE RowID = @RowCount

EXEC <myProc1> @Symbol
EXEC <myProc2> @Symbol
EXEC <myProc3> @Symbol

SET @RowCount = @RowCount + 1
END


DROP TABLE #Symbols

关于sql-server - SQL Server 游标性能缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9297482/

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