Sql server MicrosoftSQLServer2008中联接与应用的相对效率

Sql server MicrosoftSQLServer2008中联接与应用的相对效率,sql-server,sql-server-2008,join,apply,Sql Server,Sql Server 2008,Join,Apply,我们刚刚开始考虑从SQL 2000迁移到SQL 2008,并注意到新的交叉应用和内部应用语法,它允许对表值参数化UDF或相关子查询进行某种形式的“连接” 显然,能够将逻辑封装在UDF中并能够在不同的查询中重用它是很好的,但我确信这一功能是有代价的 我已经在网上查阅了很多,但是我找不到任何性能指标来表明在使用基于应用的查询时,与内联同一查询时可能得到的性能相比,您会受到多大的性能影响 我知道确切的影响在很大程度上取决于特定的模式和查询,但我很好奇是否有人有任何调整现实世界系统的经验来分享这一点。我

我们刚刚开始考虑从SQL 2000迁移到SQL 2008,并注意到新的交叉应用和内部应用语法,它允许对表值参数化UDF或相关子查询进行某种形式的“连接”

显然,能够将逻辑封装在UDF中并能够在不同的查询中重用它是很好的,但我确信这一功能是有代价的

我已经在网上查阅了很多,但是我找不到任何性能指标来表明在使用基于应用的查询时,与内联同一查询时可能得到的性能相比,您会受到多大的性能影响


我知道确切的影响在很大程度上取决于特定的模式和查询,但我很好奇是否有人有任何调整现实世界系统的经验来分享这一点。

我使用APPLY in places。如果必须这样做,强制逐行处理而不是循环是很有用的

奇怪的是,在一个地方它的效率更高(当使用探查器查看读取时),因为优化者将UDF视为一个黑盒,并根据我的需要应用过滤器

udf是一个内联表值函数,当在联接中展开/取消列出时,情况会更糟,因为optmiser将查询视为一个整体,并在不同的位置应用过滤器

否则,我会谨慎地使用它,或者在不经常运行的代码上使用它。。。并验证它不会真的杀死坏人。我接受命中以获得可维护性


离题:封装仅在数据库中发挥作用:有时会失去基于集合的优势。

“离题:封装仅在数据库中发挥作用:有时会失去基于集合的优势。”再加上一句话!是的,这似乎是SQL开发中的基本矛盾…:)