游标运行慢??为什么

codsoul 2011-06-28 10:07:52
declare triger_cursor2 cursor for
Select Test_Result_ID From RST_TEST_RESULT where Lab_No = @LabNo;
open triger_cursor2
fetch next from triger_cursor2 into @TestResultID ----就是里慢
while(@@fetch_status=0)
begin
exec refeSearch @TestResultID,@reference='a',@flag='b'

Fetch Next From triger_cursor2 InTo @TestResultID
end
close triger_cursor2
deallocate triger_cursor2
...全文
270 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
oO寒枫Oo 2011-06-30
  • 打赏
  • 举报
回复

Select Lab_No,Test_Result_ID into #test From Inserted i,RST_TEST_RESULT rst
where i.Lab_No=rst.Lab_No
declare triger_cursor1 cursor for
Select Lab_No,Test_Result_ID From #test;
open triger_cursor1 fetch next from triger_cursor1 into @LabNo,@TestResultID
while(@@fetch_status=0)
begin
select @LabNo,@TestResultID
Fetch Next From triger_cursor1 InTo @LabNo,@TestResultID
end
close triger_cursor1
deallocate triger_cursor1

oO寒枫Oo 2011-06-30
  • 打赏
  • 举报
回复
你这个需求好像是要用游标的、


Select Lab_No,Test_Result_ID into #test From Inserted i,RST_TEST_RESULT rst
where i.Lab_No=rst.Lab_No
declare triger_cursor1 cursor for
Select Lab_No,Test_Result_ID From #test;
open triger_cursor1 fetch next from triger_cursor1 into @LabNo,@TestResultID
while(@@fetch_status=0)
begin
print('test')
Fetch Next From triger_cursor1 InTo @LabNo,@TestResultID
end
close triger_cursor1
deallocate triger_cursor1


把那2个过程换成打印语句了试试 看问题到底出在哪里
[Quote=引用 28 楼 codsoul 的回复:]
引用 24 楼 lxpbs8851 的回复:
SQL code

Select Lab_No,Test_Result_ID into #test From Inserted i,RST_TEST_RESULT rst
where i.Lab_No=rst.Lab_No
declare triger_cursor1 cursor for
Select Lab_No,Test_Result……
[/Quote]
codsoul 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 lxpbs8851 的回复:]
SQL code

Select Lab_No,Test_Result_ID into #test From Inserted i,RST_TEST_RESULT rst
where i.Lab_No=rst.Lab_No
declare triger_cursor1 cursor for
Select Lab_No,Test_Result_ID From #test;
open tr……
[/Quote]
可以用,但速度还是一样,有不用游标的方法吗?
oO寒枫Oo 2011-06-30
  • 打赏
  • 举报
回复
呵呵 23楼的时候掉了个变量 不好意思
codsoul 2011-06-30
  • 打赏
  • 举报
回复
24楼的可以的.没看到别名.
codsoul 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 lxpbs8851 的回复:]
Select Lab_No,Test_Result_ID into #test From Inserted i,RST_TEST_RESULT rst
----列名 'Lab_No' 不明确。
[/Quote]
这样不行哦..

可以不用游标吗?
oO寒枫Oo 2011-06-30
  • 打赏
  • 举报
回复

Select Lab_No,Test_Result_ID into #test From Inserted i,RST_TEST_RESULT rst
where i.Lab_No=rst.Lab_No
declare triger_cursor1 cursor for
Select Lab_No,Test_Result_ID From #test;
open triger_cursor1 fetch next from triger_cursor1 into @LabNo,@TestResultID
while(@@fetch_status=0)
begin
exec refeSearch @TestResultID,@reference='a',@flag='b'
exec CalculatePrice @LabNo;
Fetch Next From triger_cursor1 InTo @LabNo,@TestResultID
end
close triger_cursor1
deallocate triger_cursor1

oO寒枫Oo 2011-06-30
  • 打赏
  • 举报
回复
用一个游标就可以了
Inserted临时表是主表插入多少数据那么Inserted就有多少记录

Select Lab_No,Test_Result_ID into #test From Inserted i,RST_TEST_RESULT rst
where i.Lab_No=rst.Lab_No
declare triger_cursor1 cursor for
Select Lab_No,Test_Result_ID From #test;
open triger_cursor1 fetch next from triger_cursor1 into @LabNo,@TestResultID
while(@@fetch_status=0)
begin
exec refeSearch @TestResultID,@reference='a',@flag='b'
exec CalculatePrice @LabNo;
Fetch Next From triger_cursor1 InTo @LabNo
end
close triger_cursor1
deallocate triger_cursor1
codsoul 2011-06-29
  • 打赏
  • 举报
回复
有什么替代这个游标的方法吗?
codsoul 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 lxpbs8851 的回复:]
说了不是游标的问题
我怀疑是过程 refeSearch 执行的时间特别的长
[/Quote]
refeSearch 不执行也慢.



declare triger_cursor1 cursor for
Select Lab_No From Inserted;
open triger_cursor1 fetch next from triger_cursor1 into @LabNo
while(@@fetch_status=0)
begin
declare triger_cursor2 cursor for
Select Test_Result_ID From RST_TEST_RESULT where Lab_No = @LabNo;
open triger_cursor2
fetch next from triger_cursor2 into @TestResultID
while(@@fetch_status=0)
begin
exec refeSearch @TestResultID,@reference='a',@flag='b'

Fetch Next From triger_cursor2 InTo @TestResultID
end
close triger_cursor2 --
deallocate triger_cursor2 --

exec CalculatePrice @LabNo;

Fetch Next From triger_cursor1 InTo @LabNo

发现是游标中有游标....应该怎样改速度才快(别人留下的东西)
--Inserted临时表是每次插入数据都增大的吗??
oO寒枫Oo 2011-06-29
  • 打赏
  • 举报
回复
说了不是游标的问题
我怀疑是过程 refeSearch 执行的时间特别的长
crazy_boom 2011-06-29
  • 打赏
  • 举报
回复
建议 换成临时表 游标本来效率就不高
WXM8511 2011-06-29
  • 打赏
  • 举报
回复
楼主的问题完全可以用临时表解决。
一般万般无奈才用游标的。
鐵蛋 2011-06-29
  • 打赏
  • 举报
回复
能不用遊標就儘量不用吧
BigInt 2011-06-29
  • 打赏
  • 举报
回复
不必人云亦云,十几条慢并不是游标本身问题,一定是因为游标类型选择不合适引起不必要的锁,看6楼
rfq 2011-06-29
  • 打赏
  • 举报
回复
游标 测试一下 效率 是在实际应用中才能体现,自己觉得可以就可以用.
哈哈
codsoul 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cd731107 的回复:]
游标是一条记录执行完成后,再执行下一条记录,当然慢,而且占用的资源也大
[/Quote]



我游标的记录数最多只有十几条,应该是不会太慢才对的啊.
BigInt 2011-06-28
  • 打赏
  • 举报
回复
游标类型选择问题

declare triger_cursor2 cursor for
Select Test_Result_ID From RST_TEST_RESULT where Lab_No = @LabNo;
--〉
declare triger_cursor2 cursor STATIC READ_ONLY for
Select Test_Result_ID From RST_TEST_RESULT where Lab_No = @LabNo;

试下,如果不行,在换成
declare triger_cursor2 cursor FAST_FORWARD for
Select Test_Result_ID From RST_TEST_RESULT where Lab_No = @LabNo;
xuexiaodong2009 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cd731107 的回复:]

游标是一条记录执行完成后,再执行下一条记录,当然慢,而且占用的资源也大
[/Quote]游标是一条记录执行完成后,再执行下一条记录,当然慢,
cd731107 2011-06-28
  • 打赏
  • 举报
回复
游标是一条记录执行完成后,再执行下一条记录,当然慢,而且占用的资源也大
加载更多回复(10)

34,588

社区成员

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

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