问题:
在 SQL 查询中,何时使用 CROSS APPLY 比使用 INNER JOIN 更有效?尽管它们在多对一关系中看起来等效,但 CROSS APPLY 性能优势的示例却难以找到。
答案:
CROSS APPLY 在复杂连接中的优势:
当连接表具有无法用 INNER JOIN 轻松表达的复杂条件时,CROSS APPLY 显示出其优势。考虑以下示例:
<code class="language-sql">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>
此查询为 t1 中的每条记录检索 t2 中的最近三条记录。这无法通过 INNER JOIN 轻松实现。
CTE 与 CROSS APPLY 的性能比较:
CROSS APPLY 的替代方法是使用带有窗口函数的公用表表达式 (CTE):
<code class="language-sql">WITH t2o AS ( SELECT t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn FROM t2 ) SELECT t1.*, t2o.* FROM t1 INNER JOIN t2o ON t2o.t1_id = t1.id AND t2o.rn <= 3</code>
但是,此方法可读性较差,并且在某些情况下效率可能较低。
示例:
为了说明性能差异,请考虑以下查询:
<code class="language-sql">-- 使用 CTE WITH q AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn FROM master ), t AS ( SELECT 1 AS id UNION ALL SELECT 2 ) SELECT * FROM t JOIN q ON q.rn <= t.id -- 使用 CROSS APPLY WITH t AS ( SELECT 1 AS id UNION ALL SELECT 2 ) SELECT * FROM t CROSS APPLY ( SELECT TOP (t.id) m.* FROM master m ORDER BY id ) q</code>
在一个大约有 20,000,000 条记录的表上,CTE 查询需要近 30 秒才能执行,而 CROSS APPLY 查询则可以立即完成。
以上是SQL 查询中 CROSS APPLY 何时优于 INNER JOIN?的详细内容。更多信息请关注PHP中文网其他相关文章!