코딩항해기
[DBMS/Oracle] SQL 실행 순서 (조건 위치 효율성) 본문
SQL 실행 순서
다음과 같은 순서로 진행된다.
- FROM
- ON
- JOIN
- WHERE
- GROUP BY (집계함수)
- HAVING
- SELECT (별칭, ROWNUM 등)
- DISTINCT
- ORDER BY
실행 순서가 중요한 이유
복잡한 쿼리를 작성하거나 쿼리의 성능을 최적화 할 때 실행 순서를 정확하게 이해하고 있어야 하기 때문이다.
또한 실행 순서를 잘못 이해하면 원하는 방향과 전혀 다른 데이터가 나올 수 있어 실행 순서를 정확하게 인지하고 있는 것이 좋다.
(앞 단에 실행된 부분만 현재 단계에서 인지할 수 있기 때문에, WHERE절에서 GROUP BY된 데이터를 인지할 수 없다.)
실행 순서를 불가피하게 변경해야하는 경우에는 서브쿼리를 사용하여 실행 순서를 변경시킬 수 있다.
상황에 따른 조건 위치 효율성
JOIN을 사용할 때
ON 절의 조건은 JOIN이 수행될 때 각 테이블의 행이 어떻게 연결될지를 결정한다.
즉, JOIN 과정 중에 두 테이블 간의 연결 기준을 정의하는 것이 ON 절의 역할이다.
WHERE 절의 조건은 모든 테이블이 JOIN된 후의 결과 세트에서 특정 조건에 맞는 행들만 선택한다.
따라서 ON 절에 조건을 추가하는 것은 JOIN을 할 때 불필요한 행을 미리 걸러낼 수 있고, WHERE 절에 조건을 추가하는 것은 JOIN이 완료된 후에 행을 걸러내는 차이가 있다. (조인 종류에 따라 결과가 다를 수 있다.)
조건이 JOIN에 직접적으로 관련되어 있고, 불필요한 행들을 미리 걸러낼 수 있다면 ON 절에 조건을 두는 것이 효율적이다.
GROUP BY를 사용할 때
GROUP BY 절은 데이터를 그룹화하여 요약된 결과를 생성한다.
특정 컬럼을 기준으로 그룹화하고 그 그룹 내에서 집계 함수를 사용할 수 있다.
HAVING 절은 그 그룹화된 결과에 대한 조건을 설정하는 데 사용된다.
WHERE 절이 그룹화 전에 행들을 필터링하는 반면, HAVING 절은 그룹화된 결과를 필터링하는 차이가 있다.
따라서 GROUP BY와 함께 조건을 적용할 때는 HAVING 절을 사용하는 것이 좋다.
그러나 일반적으로 행을 필터링할 수 있는 조건은 WHERE 절에서 미리 필터링하여 불필요한 데이터를 줄인 것을 그룹화하여 추가 조건을 적용하는 것이 효율적이다.
'DBMS > Oracle' 카테고리의 다른 글
[DBMS/Oracle] 다차원 집계함수 (CUBE, ROLLUP, GROUPING SETS) (0) | 2024.08.24 |
---|---|
[DBMS/Oracle] Null 관련 함수 (NULLIF, COALESCE) (0) | 2024.08.23 |
[DBMS/Oracle] VIEW (0) | 2024.08.04 |
[DBMS/Oracle] 집합 연산자 (0) | 2024.08.03 |
[DBMS/Oracle] JOIN (0) | 2024.08.03 |