>데이터 베이스 >MySQL 튜토리얼 >CROSS APPLY가 SQL 쿼리에서 INNER JOIN보다 성능이 뛰어난 경우는 언제입니까?

CROSS APPLY가 SQL 쿼리에서 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 쿼리에서 INNER JOIN보다 CROSS APPLY를 사용하는 것이 더 효율적인 경우는 언제인가요? 다대일 관계에서는 동등한 것처럼 보이지만 CROSS APPLY의 성능 이점에 대한 예는 찾기 어렵습니다.

정답:

복잡한 연결에서 CROSS APPLY의 장점:

CROSS APPLY는 조인된 테이블이 INNER JOIN으로 쉽게 표현할 수 없는 복잡한 조건을 가질 때 장점을 발휘합니다. 다음 예를 고려해보세요.

<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의 가장 최근 레코드 3개를 검색합니다. 이는 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 쿼리는 즉시 완료됩니다.

위 내용은 CROSS APPLY가 SQL 쿼리에서 INNER JOIN보다 성능이 뛰어난 경우는 언제입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.