반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- MySQL
- 문제풀이
- 율코딩
- HackerRank
- sql
- Index
- snowflake
- 오라클
- Join
- 조인
- Oracle
- 쿼리
- 알고리즘
- S3
- 코딩
- 결합인덱스조건
- 데이터분석
- storage_integration
- 인덱스튜닝
- dbeaber
- DB
- 결합인덱스란
- 인덱스
- 백준
- 자료구조
- 개발
- 백트래킹
- dfs
- AWS
- 데이터베이스
Archives
- Today
- Total
율코딩
[JOIN] NL Join (Nested Loops 조인) 본문
반응형
NL 조인 ( Nested Loops 조인)
NL 조인은 두 테이블이 조인을 할 때, 드라이빙 테이블( Outer 테이블)에서 결합 조건에 일치하는 레코드를 내부 테이블(Inner Table)에서 조인하는 방식이다.
- Outer Join 에서 만족하는 레코드가 적을수록 NL 조인에서 효율이 좋다.
- 조인 조건에 해당하는 컬럼들은 인덱스를 가지고 있어야 한다.
NL 조인의 예시를 보자.
아래와 같은 SQL문이 있다고 하자.
SELECT /*+ USE_NL (B) */
A.*
, B.*
FROM ITEM A
,UITEM B
WHERE A.ITEM_ID=B.ITEM_ID --- 1
AND A.ITEM_TYPE_CD = '100100' --- 2
AND A.SALE_YN = 'Y' --- 3
AND B.SALE_YN = 'Y' --- 4
ITEM_X01 -> ITEM_TYPE_CD
UITEM_PK -> ITEM_ID + UITEM_ID
힌트를 사용하여 NL 조인을 하도록 유도한다.
해당 SQL문에서 동작 순서는 어떻게 될까?
정답은 2 -> 3 -> 1 -> 4 이다.
그 이유는 아래의 그림을 통해 좀 더 쉽게 설명할 수 있다.
기준 테이블 ( Driving Table) : ITEM , Inner 테이블 : UITEM
실행 순서
- 인덱스 ITEM_X01를 통해 ITEM_TYPE_CD = 100100인 것을 스캔힌다.
- 인덱스 ITEM_X01에서 읽은 rowid를 가지고 A 테이블에 액세스해 SALE_YN = 'Y' 인 필터 조건을 만족하는 레코드를 찾는다.
- A 테이블에서 읽은 ITEM_ID와 같은 값을 가진 B 테이블의 ITEM_ID를 찾기 위해 UITEM_PK를 스캔한다.
- B 테이블에 액세스하여 SALE_YN = 'Y' 인 레코드들을 찾는다.
그렇다면 해당 SQL 문에서 최적의 인덱스는 무엇일까?
ITEM_X01 -> ITEM_TYPE_CD + SALE_YN
UITEM_PK -> ITEM_ID + UITEM_ID + SALE_YN
각각 인덱스에 SALE_YN 칼럼 값도 추가하는 것이다.
그렇다면 랜덤 액세스로 테이블로 접근할 일이 없어지기 때문에 훨씬 성능이 좋아질 수 있다.
NL 조인의 특징
- Random 액세스 위주의 조인 방식이다. 따라서 인덱스 구성이 아무리 완벽하더라도 대량의 데이터를 조인할 때 매우 비효율적이다.
- 조인을 한 레코드씩 순차적으로 진행한다는 점이다.
- 인덱스 구성 전략이 특히 중요하다. 조인 컬럼에 대한 인덱스가 있느냐 없느냐, 있다면 컬럼이 어떻게 구성됐느냐에 따라 조인 효율이 크게 달라진다.
- 이런 여러가지 특징을 종합할 때, NL 조인은 소량의 데이터를 주로 처리하거나 부분범위처리가 가능한 온라인 트랜잭션 환경에 적합한 조인 방식이라고 할 수 있다.
MySQL 에서는 오랫동안 NL 조인만 지원하고 있었다. ( 최근 MySQL 8.0.18 버전부터는 해시 조인도 지원한다.)
힌트 쓰는 방법
결합 명칭 | 힌트 방법 |
Nested Loops | SELECT /*+ USE_NL ( TABLE_NAME, TABLE_NAME2 ... ) */ COLUMN .. |
Sort Merge | SELECT /*+ USE_MERGE ( TABLE_NAME, TABLE_NAME2 .. ) */ COLUMN .. |
Hash Join | SELECT /*+ USE_HASH ( TABLE_NAME, TABGLE_NAME2 ... ) */ COLUMN .. |
해시조인과 소트머지 조인은 다음 포스팅에서 설명하겠습니다.
반응형
'데이터베이스' 카테고리의 다른 글
[오라클] 인덱스 클러스터링 팩터 (0) | 2022.10.02 |
---|---|
[오라클/MySQL] 트랜잭션 수준 읽기와 격리 수준 (Isolation Level) (5) | 2022.08.20 |
[Oracle] Sort Merge Join / Hash Join (0) | 2022.07.17 |
[DB] 결합인덱스 및 컬럼 순서 결정 방법 (0) | 2022.06.05 |
Index를 타지 않는 Query (1) | 2022.06.05 |
Comments