코딩항해기

[DBMS/Oracle] SQL 실행 순서 (조건 위치 효율성) 본문

DBMS/Oracle

[DBMS/Oracle] SQL 실행 순서 (조건 위치 효율성)

miniBcake 2024. 8. 21. 15:54

 

 

SQL 실행 순서

다음과 같은 순서로 진행된다.

 

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY (집계함수)
  6. HAVING
  7. SELECT (별칭, ROWNUM 등)
  8. DISTINCT
  9. 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