1.일반적인 쿼리의 실행순서
예제로 쿼리를 실행해 본다고 하자
SELECT DISINTCT sample_data
FROM sample_main_table a
INNER JOIN sample_sub_table b
ON a.key_id = b.key_id
WHERE sample_condition = 2
GROUP BY sample_data
HAVING SUM(sample_data) > 1
ORDER BY sample_data
(LIMIT 5)
- FROM 절이 먼저 실행이 된다.
- ON으로 조인 조건을 확인한다.
- JOIN 으로 테이블을 조인한다.
- WHERE 절을 검사하여 조건을 체크한다.
- GROUP BY 를 실행하여 조회 칼럼을 그룹화한다.
- HAVING 으로 그룹화 한 이후에 대한 데이터 조건을 체크한다.
- SELECT 로 칼럼들을 조회한다.
- DISTINCT 로 중복된 행을 삭제한다.
- ORDER BY 로 조회한 데이터를 정렬한다.
- 만약 LIMIT 를 사용 가능하다면 조회한 row를 LIMIT 만큼 제한해서 보여준다.
참고로 alias(별칭)은 FORM 절과 SELECT 절과 ORDER BY 절에서만 사용이 가능하다.
2. 서브쿼리에서의 쿼리 실행순서
SELECT DISINTCT sample_data
FROM sample_main_table a
INNER JOIN sample_sub_table b
ON a.key_id = b.key_id
WHERE sample_condition = (SELECT FROM sample_subquery_table WHERE 1=1)
- FROM 절이 먼저 실행이 된다.
- ON으로 조인 조건을 확인한다.
- JOIN 으로 테이블을 조인한다.
- WHERE 절을 검사하여 조건을 체크한다.
- 서브쿼리가 실행 되어서 1.일반적인 쿼리의 실행 순서대로 쿼리가 실행이 된다.
- GROUP BY 를 실행하여 조회 칼럼을 그룹화한다.
- HAVING 으로 그룹화 한 이후에 대한 데이터 조건을 체크한다.
- SELECT 로 칼럼들을 조회한다.
- DISTINCT 로 중복된 행을 삭제한다.
- ORDER BY 로 조회한 데이터를 정렬한다.
- 만약 LIMIT 를 사용 가능하다면 조회한 row를 LIMIT 만큼 제한해서 보여준다.
참고로 서브쿼리에서는 ORDER BY 를 사용하지 못한다.
3. 서브쿼리에 순서에 대해서 생각해볼 점
오라클에는 실행 계획이라는것이 있다. 이 실행계획에 따라 쿼리와 서브쿼리가 실행이 된다. 서브쿼리에도 인라인뷰, 스칼라 서브쿼리등 여러가지의 서브쿼리 종류가 있다. 서브쿼리의 종류에 따라, 또 메인테이블의 칼럼을 쓰고 있냐에 따라, 인덱스가 어떻게 짜여져 있냐에 따라, 옵티마이저가 어떻게 작동하냐에 따라 쿼리의 실행계획은 바뀔 수 있다. 오라클을 예로 들지만 다른 DB도 확인할 필요는 있지 않을까 싶다.
참고
구루비-데이터베이스 질문과 답
http://www.gurubee.net/article/61228
[DB/Postgres] 서브쿼리(Subquery) /WITH절 이해하기 -1
'DB관련' 카테고리의 다른 글
[DB] 테이블의 스캔방식 (0) | 2023.11.21 |
---|---|
maira db 설치하기 (0) | 2023.11.14 |
데이터 베이스 옵티마이저란? (0) | 2023.10.29 |
데이터 모델링 (0) | 2021.01.20 |
DB에 관하여 (0) | 2021.01.20 |