首页 >数据库 >mysql教程 >SQL 查询中 CROSS APPLY 何时优于 INNER JOIN?

SQL 查询中 CROSS APPLY 何时优于 INNER JOIN?

Linda Hamilton
Linda Hamilton原创
2025-01-20 11:37:10863浏览

When Does CROSS APPLY Outperform INNER JOIN in SQL Queries?

SQL 查询中 CROSS APPLY 何时优于 INNER JOIN?

问题:

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn