有什么方法可以使得游标打开后,不致于把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条视乎该月的运作情况。
----------------
定义变量
定义游标
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条视乎该月的运作情况。
----------------
定义变量
定义游标
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语句尽量写里面