我们刚刚开始考虑从SQL 2000迁移到SQL 2008,并注意到新的CROSS APPLY和INNER APPLY语法允许对表值参数化UDF或相关子查询进行“连接”形式。
显然,能够将逻辑封装在UDF中并能够在不同的查询中重用它会很好,但我确信功能会带来成本。
我在网上看了很多,但我找不到任何性能指标,表明当你使用基于APPLY的查询时,如果内联相同的内容,你将会获得多少性能指标查询。
我知道确切的影响将在很大程度上取决于特定的架构和查询,但我很好奇是否有任何人有调整现实世界系统的经验来分享。
答案 0 :(得分:4)
我在地方使用APPLY。如果必须这样做,强制逐行处理而不是循环是很有用的。
奇怪的是,在一个地方它更有效率(当使用分析器查看读取时),因为优化器将UDF视为黑盒并按我的意愿应用过滤器。
udf是一个内联表值函数,当在JOIN中展开/取消时更糟糕,因为optmiser将查询视为一个整体并将过滤器应用于不同的位置。
否则,我会谨慎地使用它或者不经常运行的代码...并验证它不会真的很糟糕。我接受命中以获得可维护性。
偏离主题:封装仅在数据库中到目前为止:在某些时候你会失去基于集合的优势。