본문 바로가기

개발기술/RDB

DB 데이터 탐색방식

 

A. “한 테이블에서 데이터를 찾는 법”

1️⃣ Index 구조 (B-Tree)
2️⃣ Access Path

  • Full Table Scan
  • Index Range Scan
  • Index Unique Scan

B. “여러 테이블의 데이터를 엮는 법”

(Join Execution 영역)

3️⃣ Filter vs Join 조건
4️⃣ Nested Loop Join
5️⃣ Hash Join
6️⃣ Sort Merge Join

 

 

1. 필터링은 먼저 일어납니다 (Predicate Pushdown)

사용자님이 말씀하신 "먼저 필터링하고" 부분은 매우 정확한 통찰입니다. DB는 성능을 위해 조인 연산을 하기 전, 가능한 한 데이터를 미리 줄이려고 합니다.

  • WHERE 절 필터링: 조인하기 전에 각 테이블에서 조건에 맞지 않는 행을 먼저 제거합니다.
  • ON 절 필터링: 조인 조건에 상수 조건(예: AND 테이블A.상태 = '활성')이 포함되어 있다면, 이 역시 조인 단계 이전에 처리하여 읽어올 데이터양을 줄입니다.

2. 조인 알고리즘의 3가지 유형

"루프를 돌면서 조인한다"는 방식은 다음 세 가지 중 하나로 실행됩니다.

① 중첩 루프 조인 (Nested Loop Join)

사용자님이 설명하신 방식입니다.

  • 순서: 외부 테이블(Outer/Driving Table)의 행을 하나씩 읽으면서, 내부 테이블(Inner/Driven Table)에서 조건에 맞는 데이터를 찾습니다.
  • 특징: 한쪽 테이블이 매우 작거나, 연결 고리(ON 조건 컬럼)에 인덱스가 잘 걸려 있을 때 사용합니다.

② 해시 조인 (Hash Join)

데이터가 아주 많을 때 루프를 돌면 너무 느리기 때문에 사용하는 방식입니다.

  • 순서: 작은 쪽 테이블의 조인 키를 가지고 메모리에 해시 테이블을 먼저 만듭니다. 그 후 큰 테이블을 읽으면서 해시 테이블에 해당 값이 있는지 즉시 찾아냅니다.
  • 특징: 루프를 돌지 않고 '한 번에' 매칭시키므로 대용량 데이터 처리에 매우 빠릅니다.

③ 소트 머지 조인 (Sort Merge Join)

  • 순서: 양쪽 테이블을 조인 키 기준으로 먼저 정렬한 뒤, 차례대로 병합(Merge)하며 조인합니다.
  • 특징: 인덱스가 없는데 데이터가 많거나, 이미 정렬이 되어 있는 경우 사용합니다.

C. “왜 그렇게 결정했는가”

(Decision Engine)

 

7️⃣ 통계 & 옵티마이저 비용 모델  :  “왜 이 방법이 싸다고 판단했는지”

 

옵티마이저 = 통계 + 수식 계산기

 

옵티마이저는 테이블을 직접 열어보지 않습니다.
오직 통계(statistics)만 봅니다.

대표적인 통계들

🔹 테이블 통계

  • 전체 row 수
  • 데이터 블록 수
  • 평균 row 길이

🔹 컬럼 통계

  • NDV (Number of Distinct Values)
  • NULL 비율
  • 최소 / 최대 값
  • 히스토그램 (분포)

🔹 인덱스 통계

  • 리프 블록 수
  • 클러스터링 팩터
  • 선택도(selectivity)