自定义标量值函数替代“Inner join”的效率问题

aychina 2011-04-26 10:49:08
有两个表如下:
表[Type] : ID(int), Name(varchar) //注:仅有3行:1,'选择';2,'判断';3,'填空'
表[Question]: ID(int), TypeID(tinyint),Val //注:数据量很大,50000行
输出结果:
ID,TypeID,TypeName,Val


实现方法:
[方法1]:
select ID,TypeID,Type.Name as TypeName,Val from Question inner join Type on  Question.TypeID=Type.ID


[方法2]: 因为表[Type]相对固定,改用自定义标量值函数如下:
    ALTER FUNCTION [dbo].[TypeName]
(
@ID tinyint
)
RETURNS varchar(10)
AS
BEGIN
declare @Name varchar(10)
select @Name=case @ID
when 1 then '选择'
when 2 then '判断'
when 3 then '填空'
end;
return @Name
END

输出改为:
select ID,TypeID,dbo.TypeName(TypeID) as TypeName,Val from Question


方法二已经验证过,可行,效率如何?请各位高人指教?
...全文
253 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gogodiy 2011-04-27
  • 打赏
  • 举报
回复
联接查询对今后的扩展有好处。
昵称被占用了 2011-04-26
  • 打赏
  • 举报
回复
“灵机一动”往往是不规范的做法,能测试来验证不错。
回南山种豆 2011-04-26
  • 打赏
  • 举报
回复
感觉连接好一点吧,创建索引后速度也很快,你如果创建一个标量函数,它本身也会占用资源的
叶子 2011-04-26
  • 打赏
  • 举报
回复
自定义函数在数据量上万后就不建议使用了。
aychina 2011-04-26
  • 打赏
  • 举报
回复
谢谢二位的答复,[Type]这个表内容基本上是固定的,为了显示,用到了inner join,昨天忽然“灵机一动”,觉得用标量值函数,就避免了表之间的join,本以为效率肯定会提高,但经过测试发现,与我想像的不一致,cpu时间反而增加了,其他资源的占用情况倒是降低了,如下:
方法1:
(381 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Question'。扫描计数 1,逻辑读取 782 次,物理读取 20 次,预读 761 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Type'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 15 毫秒,占用时间 = 217 毫秒。

方法二:
(381 行受影响)
表 'Question'。扫描计数 1,逻辑读取 782 次,物理读取 14 次,预读 761 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 31 毫秒,占用时间 = 202 毫秒。

感觉很奇怪?
--小F-- 2011-04-26
  • 打赏
  • 举报
回复
用连接多好 可以加索引 很好修改
昵称被占用了 2011-04-26
  • 打赏
  • 举报
回复
5万数据,函数中没有涉及表,所以效率不是主要问题

主要问题在于,函数实现局限了类别的扩展性,也就是说,如果将来增加类别,需要修改函数。

正常设计应该是方法一的

34,835

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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