我想在一个有534,000行的表中更新记录。如果我创建一个while循环来更新所有记录,那么它需要时间。
然后我应该为更新记录创建一个游标。在此之后,我使用Fetch创建一个用于更新的游标。这个游标在10,000行中快速完成更新过程,但是当我使用具有超过30,000行的表时,需要5分钟来执行Query。我不知道是什么问题。
我的代码
DECLARE @RNo INT --Declaring the Variable @id
DECLARE @id INT --Declaring the Variable @id
set @RNo=1
DECLARE @MyCursor CURSOR -- Declaring the Cursor
SET @MyCursor = CURSOR --Assigning the cursor
FOR
SELECT Col1 FROM MyTable --Query related to Cursor
for update of Col2
OPEN @MyCursor -- Opening the Created cursor
FETCH NEXT FROM @MyCursor --Retrieving the record one by one
INTO @id --Assigning the value in declared Variable
WHILE @@FETCH_STATUS = 0
BEGIN
update MyTable
set Col2=@RNo
where current of @MyCursor
set @RNo=@rno+1
print @id
FETCH NEXT
FROM @MyCursor INTO @id
END
CLOSE @MyCursor -- Closing the Cursor
DEALLOCATE @MyCursor -- Deallocating the Cursor Memory
注意:我的查询使用正确的数据执行,但问题是需要5分钟我只想在10秒内执行此查询。
先谢谢
答案 0 :(得分:3)
SQL Server专家曾告诉我,如果你需要使用游标,请务必确保使用LOCAL STATIC游标。除此之外,此查询将一次更新您的数据。
;WITH TMP AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY Col1) RN
FROM MyTable
)
UPDATE TMP SET Col2 = RN;
我已经任意选择根据ORDER BY Col1
生成行号,您可以调整它。你的光标没有ORDER BY
子句,所以无论如何它都是伪随机的。