我知道,这已经多次讨论过(大多数讨论都是几年前的事情......)。
但是 - 通过这些讨论 - 我得到的感觉是,存在广泛传播的常识,这是完全错误的:TV-UDF的性能不佳。
很多人更喜欢SP收集数据,为什么?
当我说TV-UDF时,我只是谈论单一语句-UDF (“Inline-UDF”)。优化器将以聪明的方式处理此权限,就好像此部分直接写入查询一样。多语句UDF表现得更糟......
从我的观点来看,为什么你几乎应该使用UDF来收集数据,我看到了以下几点:
Select count(*) from(select * from dbo.MyFunc())
“包装”UDF来预测行数。优化器将仅执行获取计数所需的部分... 当结果在任何情况下都是一个不同的行时,我使用多语句UDF,而在非常罕见的情况下SP需要游标或动态sql。
那么:为什么有这么多人使用SP收集数据?为什么这么多人都认为,UDF很糟糕?有没有什么好的理由或者这只是旧的常识?
感谢您的投入!
答案 0 :(得分:1)
我认为你正在比较苹果和橘子,我至少从未见过有关此问题的任何讨论。有讨论是否应该使用UDF,并讨论是否应该使用存储过程或临时SQL。
内联UDF是您可以在查询中使用的内容,而存储过程是您可以执行的,并且您的大多数项目符号都是这种差异的结果。
内联UDF更像是视图而不是存储过程。可以在查询中使用的参数化视图,可以sometimes be used to speed things up。
最佳表现(我做了很多比较!)
我非常希望看到内联UDF和存储过程执行相同操作并具有不同性能的场景。
并且 - 最后但并非最不重要 - 因为UDF从不写任何东西,它是 锁定点要轻得多
如果存储过程从不写任何内容,则锁定没有区别。
那么:为什么有这么多人使用SP来收集数据呢?
不要了解人,但对我来说,这完全是关于存储过程与ad hoc sql的讨论。我更喜欢存储过程,而不喜欢ad hoc。如果你想使用用户定义的函数而不是的程序,你最终会进入ad hoc sql阵营。