SQL2000在存储过程中使用游标

时间:2022-12-30 05:57:20
以ASP页面Execute SQL2000下的存储过程,存储过程中打开游标后,CPU占用率很高,导致程序运行速度缓慢,循环200条游标的记录需要近7分钟;在循环中的执行的是带有Sum函数的Select语句,每次约需要查找100条的记录。
有什么方法可以使得游标打开后,不致于把SQL服务器缓慢,或加快SQl存储过执行速度。

5 个解决方案

#1


接分

#2


不可能这么慢吧,记录那么少 ??把你写的代码贴上来看....

#3


jf

#4


原来的代码较长,稍作省略,列出中心流程
----------------

定义变量

定义游标 
if 条件1 
select 10个字段
from a inner join b inner join c left outer join d 
where 
else
select 10个字段
from a1 inner join b1 inner join c1 left outer join d1
where 

open 
fetch
while 
begin 
  select @a = f1 from t1 where (条件来源于游标的记录) 期初数
  select @a1= f11 from t11 where 期初金额
  select @b = f2,@c = f3,@d = f4 from t2 inner join t3 where 按物料编码取得中文
  select @e = f5 from t4 inner join t5 where 判断日期内取记录求和(收入数)
  select @f = f6 from t6 inner join t7 where 判断日期内取记录求和(收入金额)
  select @g = f8 from t6 inner join t7 where 判断日期内取记录求和(发出数)
  select @h = f9 from t6 inner join t7 where 判断日期内取记录求和(发出金额)
 /*每个查询中的连接都完本匹配外键,但表中的索引只有主键*/
insert into T8(a,a1,b,c,d,e,f,g,h ,i,j)
values (@a,@a1,@b,@c,@d,@e,@f,@g,@h)
fetch
end 
close
deallocate
update T8 set i=,j= 
select * from T8

循环的备品备件等物料时,需要运行4000次以上,
每个月记录一般有200-500条视乎该月的运作情况。

#5


游标的效率本就低,你中间的逻辑处理比较复杂,肯定会慢,LZ可以考虑用一用临时表操作,别外where语句尽量写里面

#1


接分

#2


不可能这么慢吧,记录那么少 ??把你写的代码贴上来看....

#3


jf

#4


原来的代码较长,稍作省略,列出中心流程
----------------

定义变量

定义游标 
if 条件1 
select 10个字段
from a inner join b inner join c left outer join d 
where 
else
select 10个字段
from a1 inner join b1 inner join c1 left outer join d1
where 

open 
fetch
while 
begin 
  select @a = f1 from t1 where (条件来源于游标的记录) 期初数
  select @a1= f11 from t11 where 期初金额
  select @b = f2,@c = f3,@d = f4 from t2 inner join t3 where 按物料编码取得中文
  select @e = f5 from t4 inner join t5 where 判断日期内取记录求和(收入数)
  select @f = f6 from t6 inner join t7 where 判断日期内取记录求和(收入金额)
  select @g = f8 from t6 inner join t7 where 判断日期内取记录求和(发出数)
  select @h = f9 from t6 inner join t7 where 判断日期内取记录求和(发出金额)
 /*每个查询中的连接都完本匹配外键,但表中的索引只有主键*/
insert into T8(a,a1,b,c,d,e,f,g,h ,i,j)
values (@a,@a1,@b,@c,@d,@e,@f,@g,@h)
fetch
end 
close
deallocate
update T8 set i=,j= 
select * from T8

循环的备品备件等物料时,需要运行4000次以上,
每个月记录一般有200-500条视乎该月的运作情况。

#5


游标的效率本就低,你中间的逻辑处理比较复杂,肯定会慢,LZ可以考虑用一用临时表操作,别外where语句尽量写里面