5. 쿼리문 조건에도 순서가 있다?
SQL 쿼리를 작성할 때, join이나 where 절에 들어가는 조건문의 순서는 중요한 역할을 한다.
가장 엄격한 필터링 조건을 먼저 배치하여 행을 최대한 빨리 필터링하면 나머지 조건에 대해 평가할 행 수가 줄어들어 성능이 향상되며, 이는 데이터베이스 시스템의 옵티마이저가 최적의 실행 계획을 수립하는 데 도움이 된다.
조건문의 효율 순위는 주로 데이터베이스의 인덱스 및 데이터 분포에 따라 다를 수 있으나 인덱스를 타는 여부로만 고려할 때, 조건문의 효율 순위는 다음과 같다.
- 동등 비교: 동등 비교는 일반적으로 인덱스를 가장 잘 활용할 수 있는 조건이다. 특정 컬럼에 대한 동등한 값을 비교하는 경우에는 인덱스를 타고 해당 값과 일치하는 행을 빠르게 찾을 수 있다.
- 날짜 비교: 날짜 컬럼에 대한 범위 조건을 사용할 때, 날짜 이후/이전을 비교할 때 인덱스를 활용하여 해당 범위 내의 행을 빠르게 찾을 수 있다.
- 포함 조건: IN, LIKE와 같은 조건은 일반적으로 인덱스를 활용하기 어렵다. 해당 조건은 여러 값 중 하나와 일치하는지를 확인하는데, 인덱스는 특정 값에 대한 빠른 조회에 특화되어 있기 때문에 인덱스 활용은 제한적이다. 조건에 포함된 값이 많을수록 인덱스의 효율은 떨어진다.
위의 내용을 기반으로 아래 쿼리에 대한 분석을 해보겠다.
-- 동등 비교, 날짜 비교, IN 조건 순으로 조건문 배치한 예시 쿼리
SELECT *
FROM table_name
WHERE column_name = 'value'
AND date_column > '2023-01-01'
AND category IN ('A', 'B', 'C');
1) 동등 비교: 'column_name' 컬럼에 대한 동등 비교 조건
'column_name' 컬럼에 인덱스가 있다면, 해당 인덱스를 활용하여 빠르게 특정 값과 일치하는 행을 찾을 수 있다. 따라서 이 부분은 인덱스를 타고 효율적으로 처리될 것으로 예상된다.
2) 날짜 비교: 'date_column' 컬럼에 대한 날짜 비교 조건
만약 'date_column' 컬럼에 인덱스가 있다면, 해당 인덱스를 활용하여 날짜 이후의 행을 찾을 수 있다. 날짜 비교 역시 인덱스를 타고 효율적으로 처리될 것으로 예상된다.
3) IN 조건: 'category' 컬럼에 대한 IN 조건
IN 조건은 인덱스를 효과적으로 활용하기 어렵다. IN 조건에 포함된 값이 많을수록 인덱스의 효율은 떨어진다. IN 조건은 인덱스를 타고 처리되지 않고, 전체 테이블을 스캔하는 방식으로 처리될 가능성이 높다.
동등 비교와 날짜 비교는 인덱스를 활용하여 효율적으로 처리될 것으로 예상되지만 IN 조건은 인덱스를 효과적으로 활용하지 못할 가능성이 있다. 인덱스의 존재 여부와 데이터의 분포에 따라 실제 성능은 달라질 수 있으므로 실제 데이터베이스에서 실행 계획을 확인하는 것이 중요하다.