백엔드/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 값 하나를 조회할 때는 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 값 하나를 조회할 때는 1-3ms
select 값을 전체 조회할 때는 3-4ms 가 걸린다
결론
IN 과 EXISTS의 차이는
EXISTS 는 row 가 존재하는지 체크하고 더이상 수행되지 않지만
IN은 실제 존재하는 데이터들의 모든 값들을 확인한다.
조회하는 데이터가 많지 않은 경우(몇백~몇천) - IN
조회하는 데이터가 많은 경우 - EXISTS
(빠른 속도가 필요한 경우 INNER JOIN )
IN은 EXISTS 에 비해 성능이 떨어진다고 하는데
쿼리 튜닝을 어떻게 하느냐에 따라서 성능이 다르기 때문에
무조건 IN이 EXISTS보다 성능이 나쁜것은 아니다.
반응형