再一次:存储过程与 TV-UDF [关闭]
Posted
技术标签:
【中文标题】再一次:存储过程与 TV-UDF [关闭]【英文标题】:Once again: Stored Procedure vs. TV-UDF [closed] 【发布时间】:2015-07-08 10:00:38 【问题描述】:我知道,这已经讨论过好几次了(大多数讨论都是几年前的......)。
但是 - 通过这些讨论 - 我感觉到,有一个广泛传播的常识是完全错误的:TV-UDF 的性能很差。
很多人更喜欢 SP 来收集数据,为什么?
当我说 TV-UDF 时,我只是在说 single-statement-UDF(“Inline-UDF”)。优化器将巧妙地处理这一权利,就好像这部分是直接写入查询中一样。多语句 UDF 的性能要差得多...
在我看来,为什么您几乎应该使用 UDF 来收集数据,我看到了以下几点:
最佳性能(我做了很多比较!) 您可以轻松地将它们与 JOIN 或 APPLY 结合使用,并获得非常复杂但仍然可读的查询(我使用了一个“univers”查询,其中包含 30 多个函数和超过 1000 列 - 只需几秒钟!) 您可以从任何地方呼叫他们(例如,通过 ODC 一次呼叫填写 EXCEL 表) 您可以将它们与 XML 调用完美混合 如果您的选择只需要列的子集,优化器将跳过不需要的部分 - SP 则不然 使用 inline-UDF,优化器可以预测行数,并能够使用其所有的索引、统计功能……但 SP 不是这样 使用 inline-UDF,当您想在后者中使用数据时,无需为插入编写整个表定义 你可以用Select count(*) from(select * from dbo.MyFunc())
“包装”一个UDF来预测行数。优化器将只执行获取计数所需的部分...
而且 - 最后但并非最不重要的一点 - 由于 UDF 从不写任何东西,它在锁定方面要轻得多
当结果在任何情况下都是一个不同的行时,我使用多语句 UDF,而当需要游标或动态 sql 时使用 SP(这种情况非常罕见)。
那么:为什么这么多人使用 SP 来收集数据?为什么这么多人认为 UDF 不好?有什么好的理由还是这只是老常识?
感谢您的意见!
【问题讨论】:
好的,我理解这种“搁置”是因为“主要基于意见”...但我确实喜欢技术讨论...我的问题不是“基于意见”而是不是“没有事实”......我想开始讨论是因为 - 在我看来 - 使用 SP 执行 SELECT 只是不好的做法。但我看到即使是非常有经验的开发人员也会这样,我认为,讨论可能是值得的。因此,如果您想重新开放,我很高兴... 既然你在别处就这个问题向我“敲门”了,我会在这里回复——这是基于意见的,在这些问题上没有明确的共识。您已经说过“我想开始讨论是因为...”但请查看What types of questions should I avoid asking?:“如果您提出问题的动机是“我想参加关于 ______ 的讨论”,那么您不应该在这里问。” @Damian,好的,这可能是一般性讨论的错误地点。但仍然:SP 是一种选择数据的糟糕方式!您与 ORDER BY 的论点是错误的(顺便说一句:您可以将带有 ROW_NUMBER 的排序字段添加到您的结果集中 - 这更好。很多人这样做 - 为什么不讨论它(不是“基于意见”但有明确的论据? 【参考方案1】:我认为您是在比较苹果和橙子,我至少从未见过任何关于此的讨论。有关于是否应该使用 UDF 的讨论,还有关于是否应该使用存储过程或 ad hoc SQL 的讨论。
内联 UDF 是您可以在查询中使用的东西,而存储过程是您可以执行的东西,您的大部分要点都是这种差异的结果。
内联 UDF 更像是一个视图,而不是一个存储过程。可以在查询中使用的参数化视图,可以sometimes be used to speed things up。
最佳性能(我做了很多比较!)
我非常希望看到内联 UDF 和存储过程执行相同操作并具有不同性能的场景。
而且 - 最后但并非最不重要 - 因为 UDF 从不写任何东西,它是 锁定点要轻得多
如果存储过程从不写任何东西,那么锁定就没有区别。
那么:为什么这么多人使用 SP 来收集数据?
不了解人,但对我来说,这完全是关于存储过程与 ad hoc sql 的讨论。我更喜欢存储过程,而其他更喜欢 ad hoc。如果你想使用用户定义的函数而不是过程,你最终会陷入 ad hoc sql 阵营。
【讨论】:
我遇到的大多数数据收集 SP 要么很老而且从未改变过(因此有一段时间 UDF 很“糟糕”),要么是由不知道如何避免游标的人完成的,循环,变量声明。许多人甚至不知道“正常”和“内联”UDF 的区别。所以——主要是为了传统——人们一直说 UDF 不好。因为它不是苹果和橘子……为了保留图片:与 SP 收集数据而不是用卡车携带一封信 :-)以上是关于再一次:存储过程与 TV-UDF [关闭]的主要内容,如果未能解决你的问题,请参考以下文章