2

我们刚刚开始考虑从 SQL 2000 迁移到 SQL 2008,并注意到新的 CROSS APPLY 和 INNER APPLY 语法允许针对表值参数化 UDF 或相关子查询的“连接”形式。

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

我在网上看了很多次,但我找不到任何性能指标来表明在使用基于 APPLY 的查询时,如果你内联相同的查询,你可能会得到多少性能影响。

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

4

1 回答 1

4

我在一些地方使用 APPLY。如果必须这样做,强制逐行处理而不是循环很有用。

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

udf 是一个内联表值函数,当它在 JOIN 中展开/取消嵌套时会更糟,因为优化器将查询视为一个整体并在不同的地方应用了过滤器。

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

题外话:封装仅在数据库中进行到此为止:在某些时候您会失去基于集合的优势。

于 2009-03-24T20:49:12.890 回答