关于自定义函数效率问题

snail0722 2015-12-24 04:45:22
表如下:
BookInfo 图书基本信息表
BookCategory 图书分类表
BookCategoryDetail 图书分类关系表 (一对多关系,一本书多个分类)

现在要查询图书信息 还要用一个字段显示 分类名称和编号信息 “00030001|分类一,00030002|分类二...”

自己写了函数:
function   [dbo].[fun_CategoryCodeName](@teamname uniqueidentifier)   
returns varchar(4000)
as
begin
declare @temp varchar(4000)
set @temp = ''
set @temp = STUFF( (SELECT ','+M.CategoryCode+'|'+MC.CategoryName FROM (SELECT * FROM BookCategoryDetail where BookGuid = @teamname ) M
LEFT JOIN BookCategory MC ON M.CategoryCode=MC.CategoryCode FOR XML PATH('')),1,1,''
)
return @temp
end


调用函数查询:
select a.*,
[dbo].[fun_CategoryCodeName](a.BookGuid) AS CategoryCode
from BookInfo a

结果能出来但是很慢 将近20秒 不到2W的数据

不用函数查询:
select a.*,
STUFF( (SELECT ','+M.CategoryCode+'|'+MC.CategoryName FROM (SELECT * FROM BookCategoryDetail where BookGuid = a.BookGuid ) M
LEFT JOIN BookCategory MC ON M.CategoryCode=MC.CategoryCode FOR XML PATH('')),1,1,''
) AS CategoryCode from BookInfo a

然后把函数提出来在语句上面直接拼接结果一样 而且一秒就出结果了

这里就疑惑了 问什么用函数就会很慢呢 ???? 菜鸟一枚 求指教
...全文
199 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2015-12-27
  • 打赏
  • 举报
回复
原因很简单, 用函数时每次只查出一本书的分类,调用次数太多了
等不到来世 2015-12-24
  • 打赏
  • 举报
回复
在BookCategoryDetail表的BookGuid这一列上建立索引试试。 另外,函数中的的Left join可改为Inner Join, 当然,这不是瓶颈所在。
snail0722 2015-12-24
  • 打赏
  • 举报
回复
引用 2 楼 gzlx 的回复:
可以这样理解,函数是运行了2w次相应的查询
那就是说函数不能随便使用啊 用了函数就相当于查询的时候每条数据都会去调函数里面的返回结果?
gzlx 2015-12-24
  • 打赏
  • 举报
回复
可以这样理解,函数是运行了2w次相应的查询
snail0722 2015-12-24
  • 打赏
  • 举报
回复
在线求指教

22,209

社区成员

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

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