关于SQL语句中重复调用自定义函数的优化问题

xieguogui 2010-09-28 04:15:23
select dbo.f(a),dbo.f(a),dbo.f(a)+1
from t

执行上述语句会不会对dbo.f(a)进行重复调用(总共需要调用三次),还是sql server自己进行了优化,只调用一次dbo.f(a),然后再计算得到另两个字段的值?
...全文
214 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xieguogui 2010-09-29
  • 打赏
  • 举报
回复
好,感谢各位的答复,结贴给分
dawugui 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xieguogui 的回复:]
确定是执行三次的吗?函数要是很费时的话,效率就会很低了,SQL Server不会做这种优化的吗?如果自己要优化就只能采用5楼的子查询方法了,感觉效率还是低了点
[/Quote]我在二楼就告诉你了,你不信?
昵称被占用了 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xieguogui 的回复:]
确定是执行三次的吗?函数要是很费时的话,效率就会很低了,SQL Server不会做这种优化的吗?如果自己要优化就只能采用5楼的子查询方法了,感觉效率还是低了点
[/Quote]
确定的
昵称被占用了 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 maco_wang 的回复:]
SQL code

select tmp.b as col1,tmp.b as col2,tmp.b+1 as col3
from
(
select dbo.f(a) as b from t
) tmp
[/Quote]
SQL对自定义函数的自动优化几乎为0,所以只能5楼的方法优化一点点
建议,不要用太多的自定义函数,除非你明确不会产生性能问题。

xieguogui 2010-09-28
  • 打赏
  • 举报
回复
这个很难测试,因为函数是确定性的,函数中不能对有任何修改的操作,所以很难用一些标识位的改变来判断函数被调用了几次,如果通过执行速度来测试的话,又比较笼统,不是很精确
billpu 2010-09-28
  • 打赏
  • 举报
回复
时间出真知,自己多做做测试看看结果
xieguogui 2010-09-28
  • 打赏
  • 举报
回复
确定是执行三次的吗?函数要是很费时的话,效率就会很低了,SQL Server不会做这种优化的吗?如果自己要优化就只能采用5楼的子查询方法了,感觉效率还是低了点
叶子 2010-09-28
  • 打赏
  • 举报
回复

select tmp.b as col1,tmp.b as col2,tmp.b+1 as col3
from
(
select dbo.f(a) as b from t
) tmp
ws_hgo 2010-09-28
  • 打赏
  • 举报
回复
函数执行了3次...
hao1hao2hao3 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 billpu 的回复:]
执行计划吧看...不清楚 帮顶
[/Quote]

同上!数据库底层会怎么处理,不是很清楚, 不过可以看看执行计划。可以了解一下。
dawugui 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 xieguogui 的回复:]
select dbo.f(a),dbo.f(a),dbo.f(a)+1
from t

执行上述语句会不会对dbo.f(a)进行重复调用(总共需要调用三次),还是sql server自己进行了优化,只调用一次dbo.f(a),然后再计算得到另两个字段的值?
[/Quote]
重复调用三次。
billpu 2010-09-28
  • 打赏
  • 举报
回复
执行计划吧看...不清楚 帮顶

34,590

社区成员

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

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