CROSS APPLY 与 INNER JOIN:CROSS APPLY 何时表现出色?
虽然 INNER JOIN
是大多数一对多关系的首选,但 CROSS APPLY
在特定情况下提供显着的性能优势。
CROSS APPLY 的主要优势:
与 INNER JOIN
不同,CROSS APPLY
不强制要求右侧表使用用户定义函数 (UDF)。在处理需要分区或分页的大型数据集时,这种看似微小的差异变得至关重要。
分区和分页方面的优势:
虽然使用 INNER JOIN
和 CROSS APPLY
的简单查询可能会产生类似的执行计划,但 CROSS APPLY
在需要分区或分页的大型数据集上表现出卓越的效率。 通过消除显式 JOIN
条件,它允许数据库优化器利用缓存的中间结果,从而加快查询执行速度。
示例:
以下查询举例说明了在对左侧表的每个行多次迭代右侧表时 CROSS APPLY
相对于 INNER JOIN
的优势:
<code class="language-sql">/* CROSS APPLY */ SELECT t1.*, t2o.* FROM t1 CROSS APPLY ( SELECT TOP 3 * FROM t2 WHERE t2.t1_id = t1.id ORDER BY t2.rank DESC ) t2o</code>
此查询有效地检索每个 t2
行的前三个 t1
记录。 使用 INNER JOIN
复制此功能将明显更加复杂且效率较低。
性能基准:
在 20,000,000 条记录的表上进行的测试显示出显着的差异:CROSS APPLY
几乎立即执行,而使用 CTE 和窗口函数的等效 INNER JOIN
查询大约需要 30 秒。
总结:
当显式 条件不可用或处理大型数据集的分区或分页时,CROSS APPLY
JOIN
是最佳选择。 它在这些场景中的效率使其成为查询优化的宝贵工具。
以上是何时应选择 CROSS APPLY 而不是 INNER JOIN 以获得最佳性能?的详细内容。更多信息请关注PHP中文网其他相关文章!