SQL Server 기준 LEFT JOIN과 NOT EXISTS 조회 쿼리 성능 차이 비교에 대한 포스팅입니다.

한 가지 유의해야 할 사항은 두 가지 구문을 활용한 쿼리의 조회조건에 테이블 인덱스를 활용해야

유의미한 결과가 도출되며 실행 예제를 통해 자세히 알아보겠습니다.

 

[실행 예제]
CLUSTERED INDEX를 설정한 테이블 2개를 생성 후 1000개 데이터 기준 조회

-- 1. table create
CREATE TABLE dbo.TABLE_A
(
A_ID INT NOT NULL PRIMARY KEY CLUSTERED IDENTITY(1,1)
);
GO
CREATE TABLE dbo.TABLE_B
(
B_ID INT NOT NULL PRIMARY KEY CLUSTERED IDENTITY(1,1)
);
GO

-- 2. 1000 rows data insert
INSERT INTO dbo.TABLE_A DEFAULT VALUES;
GO 1000

INSERT INTO dbo.TABLE_B DEFAULT VALUES;
GO 1000

-- 3. random rows delete
DELETE FROM dbo.TABLE_B WHERE B_ID % 5 = 1;

-- 4-1. LEFT JOIN query
SELECT *
  FROM dbo.TABLE_A AS A
  LEFT JOIN dbo.TABLE_B AS B ON A.A_ID = B.B_ID
 WHERE B.B_ID IS NULL;

-- 4-2. NOT EXISTS Query
SELECT *
  FROM dbo.TABLE_A AS A
 WHERE NOT EXISTS (SELECT 1
                     FROM dbo.TABLE_B
                    WHERE B_ID = A.A_ID);

 

[실행계획 결과]

논리적으로 동일할 것이라 예상했지만 놀랍게도 NOT EXISTS가 성능이 좋은 것으로 확인됩니다. 

그 이유는 NOT EXISTS 구문에서 TABLE B에 접근하는 데이터 행 수가 LEFT JOIN에 비해 적기 때문인데요.

 

하지만 실행예제는 TABLE A와 TABLE B의 데이터 행이 같은 경우에 대해 테스트를 진행하였고

TABLE A가 매우 크거나 TABLE B가 매우 작은 경우 LEFT JOIN 구문이 더욱 좋은 효율을 낼 수 있습니다.

그렇기 때문에 상황에 맞게 사용하는 것이 중요합니다.

 

읽어주셔서 감사합니다.

레퍼런스

https://qastack.kr/dba/121034/best-practice-between-using-left-join-or-not-exists

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기