Microsoft SQL Server 2008 中 JOIN 与 APPLY 的相对效率

Posted

技术标签:

【中文标题】Microsoft SQL Server 2008 中 JOIN 与 APPLY 的相对效率【英文标题】:Relative Efficiency of JOIN vs APPLY in Microsoft SQL Server 2008 【发布时间】:2009-03-24 20:32:47 【问题描述】:

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

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

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

我知道确切的影响将在很大程度上取决于特定的架构和查询,但我很好奇是否有人在调整实际系统方面有任何经验可以分享这方面的经验。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

"题外话:封装在数据库中的应用到目前为止:在某些时候你会失去基于集合的优势。"加一个只是为了这么说! 是的,这似乎是 SQL 开发中的基本张力...... :)

以上是关于Microsoft SQL Server 2008 中 JOIN 与 APPLY 的相对效率的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft SQL Server 2008 R2 安装遇到的问题

Microsoft SQL Server 2008 R2 安装遇到的问题

Microsoft SQL Server 2008 日志分析

还原数据库时出现 Microsoft SQL Server 2008 错误

Microsoft SQL Server 2008 主键的含义

Microsoft SQL Server 2008:写入服务器失败