请各位sql大虾指点迷径

blp 2002-10-10 12:53:47
DROP TABLE TestCursor
CREATE TABLE TestCursor(
Id int NOT NULL,
Amount int Primary key (id))

DECLARE @id int
set @id = 1
while @id<10000
begin
insert testcursor values (@id,@id)
set @id = @id +1
end

/*遍历更新*/
DECLARE test CURSOR FOR SELECT * FROM TestCursor FOR UPDATE
OPEN test
Fetch Next From test
WHILE @@FETCH_STATUS = 0
BEGIN
Update TestCursor set Amount = Amount * 10 WHERE CURRENT OF test
IF @@FETCH_STATUS =0
BEGIN
Fetch Next From test
END
END
close test
DEALLOCATE test

遍历更新一遍需要大约需要13秒,即使去除更新的这一句,也需要大约9秒
可是用直接用Update TestCursor set Amount = Amount * 10 是<1s,用游标怎么会反而这么慢。现在有个存储过程,需要用到类是上面的遍历更新。这个速度是太慢,是不是我的写法有问题,请各位sql高手帮忙
...全文
74 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
blp 2002-10-10
  • 打赏
  • 举报
回复
谢谢大家的回答,结贴了
blp 2002-10-10
  • 打赏
  • 举报
回复
to Yang_(扬帆破浪) ( )
这是同一台机器,数据库在我的机器上。
to ryan2002(ryan2002)
现在写的只是一个对游标操作的测试,只是一个例子。实际中需要用到的。

Yang_ 2002-10-10
  • 打赏
  • 举报
回复
游标速度肯定比单条update按数量级的慢,而且速度和数据有关,不好预测,尽量不要拥游标!
Yang_ 2002-10-10
  • 打赏
  • 举报
回复
ado的遍历速度和数据库没有关系,数据全都取到了客户端,只和客户端的速度、内存大小有关!
j9988 2002-10-10
  • 打赏
  • 举报
回复
一个个更新就这速度,最好能用批量更。尽量不用到游标。
尽量在UPDATE语句,使一句或几句可完成,如你说的
Update TestCursor set Amount = Amount * 10
ryan2002 2002-10-10
  • 打赏
  • 举报
回复
这么简单的计算还用的到游标吗?用集合操作也可以做啊
j9988 2002-10-10
  • 打赏
  • 举报
回复
一个个更新就这速度,最好能用批量更。尽量不用到游标。
尽量在UPDATE语句,使一句或几句可完成,如你说的
Update TestCursor set Amount = Amount * 10
blp 2002-10-10
  • 打赏
  • 举报
回复

DECLARE @id int
DECLARE test CURSOR FOR SELECT id FROM TestCursor
OPEN test
Fetch Next From test into @id
WHILE @@FETCH_STATUS = 0
BEGIN
/*去掉下面这一句<1s,加上这一句=11s*/
Update TestCursor set sl = 0 WHERE id=@id
Fetch Next From test into @id
END
close test
DEALLOCATE test
说明移动游标的速度是很快的,慢是慢在更新上
还有什么办法能加快这个更新速度吗
j9988 2002-10-10
  • 打赏
  • 举报
回复
你的机器真好。我好谢幕
blp 2002-10-10
  • 打赏
  • 举报
回复
to :j9988(j9988)
我测试了一下,在vb程序中打开一个结果集,然后遍历更新上面的测试数据=6s,直接在查询分析器中用游标=11s
zhenchun 2002-10-10
  • 打赏
  • 举报
回复
使用的字段越少,表的设计越简单,就越快
j9988 2002-10-10
  • 打赏
  • 举报
回复
<1s 用游标不可能
j9988 2002-10-10
  • 打赏
  • 举报
回复
declare @id int
这样会快一点
DECLARE test CURSOR FOR SELECT id FROM TestCursor
OPEN test
Fetch Next From test into @id
WHILE @@FETCH_STATUS = 0
BEGIN
Update TestCursor set Amount = Amount * 10 WHERE id=@id
Fetch Next From test into @id
END
close test
DEALLOCATE test
blp 2002-10-10
  • 打赏
  • 举报
回复
可是如果在java中用jdbc或者在VB中用ADO打开一个结果集,从头遍历到尾(包括更新),像上面的测试数据都绝对的<1s
dotAge 2002-10-10
  • 打赏
  • 举报
回复
游标当然比UPDATE更新慢,而且还不是一点点的慢。

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧