用存储过程写递归。为什么效率那么低,求优化,大概7000条数据 在普通电脑上 运算了1分25秒

那天早上 发布于 2012/07/24 14:58
阅读 344
收藏 0
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


-- 调用
/*
declare @retStr varchar(max)
set @retStr=''
exec Zation_Str  '009',@retStr output
select @retStr
*/

ALTER PROCEDURE [dbo].[Zation_Str]
@actid varchar(60),
@retStr varchar(max) output
as
begin
declare @MaxNum bigint,@NowNum bigint, @sactid varchar(60),@inNum bigint
set @MaxNum=0
set @NowNum = 1
set @inNum=0

select @MaxNum =count(1)
from so_zation
where state>0 and fatherid=@actid

    while @NowNum<=@MaxNum
    begin
        select @sactid=actid,@retStr=@retStr+'<tr><td>'+actid+actname+fatherid+'</td></tr>' from (select actid,actname,fatherid,(row_number() over(order by actid asc))as num 
        from so_zation
        where state>0 and fatherid=@actid ) as next where num=@NowNum

            select @inNum =count(1)
            from so_zation
            where state>0 and fatherid=@sactid
            if @inNum >0
            begin
                exec Zation_Str @sactid,@retStr output
            end

        set @NowNum=@NowNum+1
    end

end





加载中
0
Hunts
Hunts

问题在于你在循环内部,每一次都要做SELECT。也就是你SELECT执行了7000次。

改造为采用表变量后循环,或者使用游标循环,可以提升很大的效率。

 

那天早上
那天早上
谢谢啦。自己没注意到。。悲催
0
那天早上
那天早上
我想直接拼接TR TD 生成个HTML的 Table
0
jsworld
jsworld
在存储过程里面一般是写表直接的一些业务关系,拼接html建议你写在应用程序里面,这样比较好一点。至于速度为什么慢,也许和‘+’ 有一定的关系。但是不排除数据检索做了重复的工作
jsworld
jsworld
回复 @孔凡儒 : 现在已经不是凭快的年代了,硬件基本不是问题,关键的是维护,你写到存储过程里面,别人来维护你的代码,程序的部分不会想到在存储过程里面。效率不是一个程序的第一位,第一位是可维护性和可扩展性
那天早上
那天早上
在这里面拼接好直接在页面展示 这样多块、
返回顶部
顶部