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

发布于 2021-11-13 16:21:27 字数 1851 浏览 871 评论 6

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

南冥有猫 2021-11-17 02:06:04

在这里面拼接好直接在页面展示 这样多块、

海之角 2021-11-17 00:46:18

回复
现在已经不是凭快的年代了,硬件基本不是问题,关键的是维护,你写到存储过程里面,别人来维护你的代码,程序的部分不会想到在存储过程里面。效率不是一个程序的第一位,第一位是可维护性和可扩展性

千笙结 2021-11-16 23:53:02

在存储过程里面一般是写表直接的一些业务关系,拼接html建议你写在应用程序里面,这样比较好一点。至于速度为什么慢,也许和‘+’ 有一定的关系。但是不排除数据检索做了重复的工作

梅窗月明清似水 2021-11-16 22:15:06

我想直接拼接TR TD 生成个HTML的 Table

顾忌 2021-11-16 12:27:49

谢谢啦。自己没注意到。。悲催

飘然心甜 2021-11-16 09:34:37

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

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

 

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文