백엔드/DB

[SQL] IN, EXISTS 비교 및 속도 비교

작은소행성 2023. 9. 10. 22:47

IN

in은 입력된 값들 중 하나라도 일치하는 것이 있으면 조회된다. 

쿼리가 실행될 때 내부적으로 or 연산자로 변경되어 실행되는 것이다. 

 

select e.emp_no
from employees.employees e
where emp_no in (SELECT s.emp_no from employees.salaries s);
     
           
select e.*
from employees.employees e
where emp_no in (SELECT s.emp_no from employees.salaries s)

employees 데이터는 300,024개

salaries 데이터는 2,844,047개이다

 

 

select 값이 하나일 때 / select 값이 전체일 때

시간 초가 계속 변하긴 하지만

select 값 하나를 조회할 때는 3-5ms 

select 값을 전체 조회할 때는 4-5ms 가 걸린다 

 

 

EXISTS

in 구문과 다르게 메인 쿼리를 가져오고 exists의 서브쿼리를 실행시켜 결과가 존재하는지 판단한다.

in은 비교할 값을 직접 대입할 수 있지만 exists연산자는 서브쿼리만 사용할 수 있다는 특징이 있다. 

 

select e.emp_no
from employees.employees e
where EXISTS (SELECT s.emp_no from employees.salaries s)    
     
select e.*
from employees.employees e
where EXISTS (SELECT s.emp_no from employees.salaries s)

 

select 값이 하나일 때 / select 값이 전체일 때

시간 초가 계속 변하긴 하지만

select 값 하나를 조회할 때는 1-3ms 

select 값을 전체 조회할 때는 3-4ms 가 걸린다 

 

 

 

 

결론

IN 과 EXISTS의 차이는 

EXISTS 는 row 가 존재하는지 체크하고 더이상 수행되지 않지만 
IN은 실제 존재하는 데이터들의 모든 값들을 확인한다. 

 

조회하는 데이터가 많지 않은 경우(몇백~몇천) - IN

조회하는 데이터가 많은 경우 - EXISTS

(빠른 속도가 필요한 경우 INNER JOIN )

 

IN은 EXISTS 에 비해 성능이 떨어진다고 하는데

쿼리 튜닝을 어떻게 하느냐에 따라서 성능이 다르기 때문에

무조건 IN이 EXISTS보다 성능이 나쁜것은 아니다. 

 

 

반응형