这么少的数据,查询竟然2秒?

xi_ha 2010-01-20 04:09:33
sql2000,查找树形菜单,整个表的数据才3000行,写了个函数,用于查找根节点,效率啊,极其的低下,搞的很抑郁。

表的主要结构,tb(menuid int ,menuname varchar(100),parentid int)
parentid=0表示为根节点
menuid 节点编号
menuname 名称

功能,任意传入一个节点编号,都返回它的根。
比如节点:开发语言(menuid=12)--vb(menuid=45)--基础类(menuid=25)

传入参数:45,返回12
传入参数:25,返回12
传入参数:12,返回12

我写的函数如下:在节点编号与父节点编号彼此循环

create function get_parentid( @menuid int)
Returns varchar(300)
as

begin
declare @pid int,@mid int,@out_str varchar(100)

select @pid=parentid,@mid=menuid from tb where menuid=@menuid

if @pid<>0
begin
while @menuid!=0
begin
select @mid=menuid ,@menuid=parentid from tb where menuid=@menuid
end

end

return @mid
end

==================调用,耗时2秒

select menuid,menuname,parentid,dbo.get_parentid(menuid)
from tb where dbo.get_parentid(menuid)=200
...全文
185 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
envykok 2010-01-21
  • 打赏
  • 举报
回复
但 2000 汗
envykok 2010-01-21
  • 打赏
  • 举报
回复
用with 玩递归哈
xi_ha 2010-01-21
  • 打赏
  • 举报
回复
速度太慢了,后来啊,都要11秒了,连我都无法忍受哒,何况别人。。。。。
哎,期待高手。

目前为了救急,我只好在表中新加了一个字段,来保存这个顶级节点编号。
递归咋儿就搞的这么失败呢
jwwyqs 2010-01-20
  • 打赏
  • 举报
回复
gz
小宏 2010-01-20
  • 打赏
  • 举报
回复
lg哥用cet怎么做啊!!!
lg3605119 2010-01-20
  • 打赏
  • 举报
回复
2005 数据库可以使用公用表达式WITH 的用法
--小F-- 2010-01-20
  • 打赏
  • 举报
回复
函数用不到索引 没什么好办法
SQL77 2010-01-20
  • 打赏
  • 举报
回复
2秒还嫌多?一个函数还要循环
andysun88 2010-01-20
  • 打赏
  • 举报
回复

就是 函数 get_parentid 引起来的,你去掉函数看看

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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