반응형

지금까지 SQL 쿼리문을 작성하면서, IN과 JOIN과 같은 것들은 정말 많이 사용했다. 근데, 이 IN도 무분별하게 사용하면 SQL 쿼리의 성능이 떨어질 수 있다. 그래서 이 IN과 EXISTS, JOIN의 속도에 대한 글을 기록하려고 한다.

 

일단, 결론을 말하자면 IN보다는 EXISTS가 더 빠르고, 그 다음에 JOIN이 더 빠르다고 한다. 그래서, 속도 차이에 대해 실험을 했다. 근데, IN > EXISTS > JOIN 으로 역으로 더 빠른 것으로 나온다.

 

먼저 실험을 한 테이블에 대한 정보는 아래와 같다.

 

1. A Table

- 데이터 개수 : 52,489개

- ID는 인덱스 적용

- 컬럼 개수 : 25개

 

2. B Table

- 데이터 개수 : 52,488개

- ID는 인덱스 적용

- 컬럼 개수 : 18개

 

1. IN

-- 4.06초
SELECT ID
  FROM A
 WHERE ID IN ( SELECT ID FROM B )

 

위와 같이, IN을 썼을 때 4.06초가 걸렸다. 물론, ID만 가져오는 경우다. 업무에 사용하는 쿼리에서는 1가지의 컬럼에 대해서만 조회를 하는게 아니기 때문에, 컬럼의 개수가 늘어난다면 시간도 늘어날 것이다. 그래서 A 테이블에 대한 데이터의 컬럼들을 다 가져와서 시간을 측정했다.

-- 29.12초
SELECT *
  FROM A
 WHERE ID IN ( SELECT ID FROM B )

 

전체 컬럼을 다 가져올 경우 29,12초가 걸렸다. 이게 매번 측정할 때마다 시간이 바뀌긴 하지만, 거의 EXISTS 보다 IN이 속도가 더 빠른 경우가 많긴 했다. 물론, 간단한 테이블인 경우에는 EXISTS가 더 빠를 수 있겠지만, 아직까지 왜 IN이 속도가 더 잘 나오는지 모르겠다.

 

2. EXISTS

-- 5.58초
SELECT ID
  FROM A
 WHERE EXISTS ( SELECT ID FROM B )

 

EXISTS 같은 경우에는 ID 컬럼 1개만 가져왔을 때, 5.58초가 걸렸다. 그리고 나서, A 테이블의 전체 컬럼을 가져올 경우도 측정했다.

-- 26.67초, 27.82초
SELECT *
  FROM A
 WHERE EXISTS ( SELECT ID FROM B )

 

위와 같이 했을 때도, EXISTS가 IN보다 시간이 더 걸리는 경우가 더 많았다. 그 중에서도 EXISTS가 IN보다 성능 좋은 시간만 추가를 했는데 대략 2~3초 차이다.

 

3. JOIN

-- 4.16초    
SELECT A.ID
  FROM A
INNER JOIN B ON A.ID = B.ID

 

이번에는 INNER JOIN으로 할 경우다. INNER JOIN으로 A테이블의 ID 컬럼 1개만 가져올 경우네는 IN과 EXISTS보다 속도가 더 빨랐다. 근데, 업무에서 1개만 가져오는게 아닌 여러 컬럼을 가져온다. 그래서 아래와 같이 조인된 모든 테이블의 컬럼을 다 가져오는 경우도 측정했다.

 

-- 65.60초    
SELECT *
  FROM A
INNER JOIN B ON A.ID = B.ID

 

65.60초가 걸렸다. 물론, A와 B 테이블에 중복된 컬럼이 있어서 컬럼이 더 늘어나서 시간이 오래 걸린 것으로 결론이 나타난다.

 

4. 결론

쿼리튜닝도 쿼리튜닝이겠지만, 무조건 IN이 EXISTS보다 성능이 나쁘다. 이것은 절대 아니라고 말하고 싶다. 데이터가 많은 경우와 컬럼이 많은 경우에도 IN과 EXISTS에 대한 성능이 다른 것으로 보인다. 그렇기에, 쿼리를 튜닝할 때 실험적으로 여러 케이스를 해보면서 시간을 비교해야 할 것으로 보인다.

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