-
SQL 논리적 실행 순서CS/DB 2024. 11. 15. 21:09반응형
Introduction
쿼리의 동작 원리를 이해하는 것은 최적화와 디버깅에 매우 중요하다.
나또한 과거 모 기업의 면접에서 물어보기 전 까진 동작순서에 대해 모른채로 INDEX관련 쿼리튜닝만 수행하고있었는데 동작순서를 알고나니 튜닝할 수 있는 범위가 늘어난걸 느꼇었다.
그때 공부한 내용을 정리해본다.
SQL 실행 순서란?
일반적인 SQL 쿼리에서는 SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY와 같은 여러 절들이 혼합되어 사용된다.
하지만 SQL의 실행은 우리가 작성한 쿼리문에 나열된 순서와 다르게 진행되며, 진행 순서에따라 어떤 데이터를 어떻게 조회하고 가져오는지가 정해져, 쿼리 최적화를 위해선 알고있어야 하는 개념이다.
SQL 실행 순서
1. FROM
- SQL은 가장 먼저 FROM 절을 실행하여 데이터의 소스를 결정한다. 이 단계에서 테이블이 하나 이상 지정되고, 필요한 경우 조인(join) 연산이 수행된다
- 복수의 테이블이 조인되는 경우, 조인 방식에 따라 데이터의 크기가 크게 증가하거나 줄어들 수 있으며, 테이블이 조인되어 임시 테이블이 만들어진다.
2. JOIN
- FROM 절에서 지정된 테이블 간의 조인이 필요한 경우, 조인 조건에 따라 두 테이블을 결합한다.
3. WHERE
- FROM과 JOIN 결과에 대해 WHERE 절을 사용하여 조건을 걸고, 해당 조건을 만족하지 않는 데이터는 제거한다.
- WHERE 절은 GROUP BY, HAVING 절과 같은 후속 절에 전달할 데이터를 미리 필터링하므로 데이터의 양을 줄여 후속 연산에 대한 속도를 향상시킨다.
4. GROUP BY
- SUM, COUNT, AVG 등의 집계 함수가 특정 그룹에 대해 집계 데이터를 반환한다.
5. HAVING
- GROUP BY 절에서 생성된 그룹화된 데이터를 추가로 필터링한다.
- WHERE 절과 HAVING 절의 차이점은, WHERE 절이 그룹화 이전의 데이터를 필터링하는 반면, HAVING 절은 그룹화 이후의 데이터를 필터링한다는 것이다
6. SELECT
- 최종적으로 보고자 하는 컬럼을 지정하고, 집계 함수나 연산을 수행하여 최종 데이터를 생성한다.
7. DISTINCT
- 가능하다면 성능을 위해서 GROUP BY를 사용하는게 좋다. 그이유는 인덱스활용여부,query plan최적화 여부때문이다.
8. ORDER BY
9. LIMIT
- 내생각엔 가장 흥미로운 구문이다. 직관적으로 생각하면 리미트절이 가장 마지막에 실행되기에, 데이터 전송량을 제외하고는 성능상 의미가 없어야하지만, 실제로는 성능차이가 상당히 많이나오게된다 그 이유는 해당 구문의 실행자체는 맨 마지막에 되지만 해당 구문을 보고 SQL 엔진이 자체적으로 실행계획을 최적화하기때문이다.
결론
SQL의 실행 순서는 우리가 쿼리를 작성한 순서와 다르기 때문에, 이를 잘못 이해하면 예상치 못한 결과가 나올 수 있고, 비 효율적인 쿼리를 작성하게 될 수도 있다. 간단하게는 WHERE 절을 통해 데이터 양을 미리 줄이면, 이후에 실행되는 GROUP BY 절의 부담을 줄일 수 있을것이다.
반응형