再次:存储过程与TV-UDF

时间:2015-07-08 10:00:39

标签: sql-server sql-server-2008 stored-procedures sql-server-2012 stored-functions

我知道,这已经多次讨论过(大多数讨论都是几年前的事情......)。

但是 - 通过这些讨论 - 我得到的感觉是,存在广泛传播的常识,这是完全错误的:TV-UDF的性能不佳。

很多人更喜欢SP收集数据,为什么?

当我说TV-UDF时,我只是谈论单一语句-UDF (“Inline-UDF”)。优化器将以聪明的方式处理此权限,就好像此部分直接写入查询一样。多语句UDF表现得更糟......

从我的观点来看,为什么你几乎应该使用UDF来收集数据,我看到了以下几点:

  • 最佳表现(我做了很多比较!)
  • 您可以轻松地将它们与JOIN或APPLY一起使用,并获得非常复杂但仍然可读的查询(我使用一个“univers”查询,包含超过30个函数,超过1000列 - 只需几秒钟!)
  • 您可以从任何地方拨打电话(例如,通过ODC拨打电话填写EXCEL表)
  • 您可以将它们与XML调用完美混合
  • 如果您的选择只需要列的子集,优化程序将跳过不需要的部分 - 而不是SP
  • 使用内联UDF,优化程序可以预测行数,并且能够使用其所有索引,统计功能......而不是SP
  • 使用内联UDF时,如果要使用后者中的数据,则无需为插入编写整个表定义
  • 您可以使用Select count(*) from(select * from dbo.MyFunc())“包装”UDF来预测行数。优化器将仅执行获取计数所需的部分...
  • 并且 - 最后但并非最不重要 - 因为UDF从不写任何东西,它在锁定方面要轻得多

当结果在任何情况下都是一个不同的行时,我使用多语句UDF,而在非常罕见的情况下SP需要游标或动态sql。

那么:为什么有这么多人使用SP收集数据?为什么这么多人都认为,UDF很糟糕?有没有什么好的理由或者这只是旧的常识?

感谢您的投入!

1 个答案:

答案 0 :(得分:1)

我认为你正在比较苹果和橘子,我至少从未见过有关此问题的任何讨论。有讨论是否应该使用UDF,并讨论是否应该使用存储过程或临时SQL。

内联UDF是您可以在查询中使用的内容,而存储过程是您可以执行的,并且您的大多数项目符号都是这种差异的结果。

内联UDF更像是视图而不是存储过程。可以在查询中使用的参数化视图,可以sometimes be used to speed things up

  

最佳表现(我做了很多比较!)

我非常希望看到内联UDF和存储过程执行相同操作并具有不同性能的场景。

  

并且 - 最后但并非最不重要 - 因为UDF从不写任何东西,它是   锁定点要轻得多

如果存储过程从不写任何内容,则锁定没有区别。

  

那么:为什么有这么多人使用SP来收集数据呢?

不要了解人,但对我来说,这完全是关于存储过程与ad hoc sql的讨论。我更喜欢存储过程,而不喜欢ad hoc。如果你想使用用户定义的函数而不是的程序,你最终会进入ad hoc sql阵营。