집 >데이터 베이스 >MySQL 튜토리얼 >CROSS APPLY가 SQL 쿼리에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!