행위

"실행계획 조인 읽는 순서"의 두 판 사이의 차이

DB CAFE

(실행계획에서 조인 읽는 방법)
 
(같은 사용자의 중간 판 6개는 보이지 않습니다)
1번째 줄: 1번째 줄:
 
== 실행계획에서 조인 읽는 방법 ==
 
== 실행계획에서 조인 읽는 방법 ==
 +
# 안에서 바깥으로
 +
# 위에서 아래로
 
[[파일:조인순서.jpg]]
 
[[파일:조인순서.jpg]]
[[Category:oracle]]
+
=== 예외적인 사항 ===
 +
# 해시조인 시 BUILD INPUT 처리시
 +
<source lang=sql>
 +
SELECT /*+ leading(E) use_hash(D) swap_join_inputs(D) */ E.EMPNO, E.ENAME, E.SAL, D.DNAME
 +
FROM DEPT D
 +
INNER JOIN EMP E
 +
ON D.DEPTNO = E.DEPTNO
 +
AND E.SAL > 1500
 +
AND E.JOB = 'SALESMAN'
 +
WHERE D.DNAME = 'SALES'
 +
;
 +
 
  
== 조인시 성능 튜닝 요소 ==
+
Execution plan
=== NL조인 ===
+
-----------------------------------------------------------------
# NL조인은 Random 액세스 발생량에 의해 성능이 결정됨
+
| Id | Operation          | Name  | Card  | Bytes | Cost (%CPU)|
# WHERE 조건이 없는 경우에는 드라이빙테이블(OUTER)은 작은 쪽 집합을 드라이빙하는 것이 유리합니다.
+
-----------------------------------------------------------------
# WHERE 조건이 있는 경우에는 WHERE 조건절 컬럼의 인덱스 존재 및 구성여부에 따라 성능이 결정되며, 작은 쪽 집합을 드라이빙하는 것이 유리합니다.
+
|  0| SELECT STATEMENT    |        |    1 |    32 |    8    (0)|
# INNER쪽 테이블의 조인 컬럼에 인덱스 존재 여부가 성능에 결정적인 요소임.
+
|*  1|  HASH JOIN          |        |    1 |    32 |    8    (0)|
## NL조인에서는 Random 액세스 발생량 외에도 Inner 쪽 인덱스 구성 및 조건절 연산자 형태에 따라 성능이 크게 좌우되는데, 인덱스 스캔 효율에 차이가 생기기 때문.
+
|*  2|  TABLE ACCESS FULL | DEPT  |    1 |    13 |    4    (0)|
 +
|*  3|  TABLE ACCESS FULL | EMP    |    2 |    50 |    4    (0)|
 +
-----------------------------------------------------------------
  
=== 해시 조인 ===
+
Predicate Information (identified by operation id):
# Build Input을 작은 쪽 테이블로 드라이빙하는것이 유리 (SWAP_JOIN_INPUTS 힌트로 조절)
+
-----------------------------------------------------------------
# 해시조인은 Hash Area에 Build Input을 모두 채울 수 있느냐가 관건
+
  1 - access("D"."DEPTNO"="E"."DEPTNO")
+
-----------------------------------------------------------------
=== 소트머지 조인 ===
+
</source>
# 소트머지 조인과 해시조인에서도 순서가 중요
+
# 해시조인 시 EARLIER FILTER 서브쿼리
# 소트머지 조인은 PGA상에서 정렬된 집합(Sort Area)을 통해 조인 액세스가 일어나기 때문에 Random 액세스 발생량 보다 소트 부하에 의해 성능 결정됨.
+
## [[EARLIER Filter 서브쿼리]]
## 즉, 디스크 소트가 발생할 정도의 큰 테이블을 포함할 때는 큰 테이블을 드라이빙하는 것이 빠르지만 메모리 소트방식으로 조인할 때는 적은 쪽 테이블을 드라이빙하는 것이 조금 더 빠름
+
----
 +
[[Category:oracle]]

2023년 6월 27일 (화) 13:33 기준 최신판

thumb_up 추천메뉴 바로가기


1 실행계획에서 조인 읽는 방법[편집]

  1. 안에서 바깥으로
  2. 위에서 아래로

조인순서.jpg

1.1 예외적인 사항[편집]

  1. 해시조인 시 BUILD INPUT 처리시
SELECT /*+ leading(E) use_hash(D) swap_join_inputs(D) */ E.EMPNO, E.ENAME, E.SAL, D.DNAME
FROM DEPT D
	INNER JOIN EMP E
	ON D.DEPTNO = E.DEPTNO
	AND E.SAL > 1500
	AND E.JOB = 'SALESMAN'
WHERE D.DNAME = 'SALES'
;


Execution plan
-----------------------------------------------------------------
| Id | Operation           | Name   | Card  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------
|   0| SELECT STATEMENT    |        |     1 |    32 |    8    (0)|
|*  1|  HASH JOIN          |        |     1 |    32 |    8    (0)|
|*  2|   TABLE ACCESS FULL | DEPT   |     1 |    13 |    4    (0)|
|*  3|   TABLE ACCESS FULL | EMP    |     2 |    50 |    4    (0)|
-----------------------------------------------------------------

Predicate Information (identified by operation id):
-----------------------------------------------------------------
   1 - access("D"."DEPTNO"="E"."DEPTNO")
-----------------------------------------------------------------
  1. 해시조인 시 EARLIER FILTER 서브쿼리
    1. EARLIER Filter 서브쿼리