🐢 꼬부기 LV.1 | 개념•기초/💧물대포(핵심개념)

SQLD 자격검정 실전문제 과목3 11~19

서화 2026. 3. 1. 23:26

정답 1번

I/O 튜닝의 핵심 원리는 Sequential 액세스에 의한 선택 비중을 높이고 Random 액세스 발생량을 줄이는 것이다

디스크/스토리지에서 데이터 읽기는 연속된 구간을 쭉 읽는 순차 접근(Sequential) 이 훨씬 빠르다

랜덤 접근(Random I/O) 은 필요한 데이터가 여기저기 흩어져 있어서, 매번 위치를 바꾸며 읽게 된다
이때마다 탐색(Seek) 비용이 누적되고, I/O가 조금만 많아져도 성능이 급격히 떨어진다

그래서 튜닝의 핵심은 랜덤 I/O 발생 횟수 자체를 줄이는 것이다

따라서 ㄱ은 Sequential ㄴ은 Random이 된다

정답 1번

  • 2번은 Multimlock I/O는 한 Extent에 속한 블록을 가져온다
  • 3번은 테이블의 크기와는 무관하다
  • 4번은 I/O는 Block 단위로 진행한다.

인덱스로 조건을 찾으면, 인덱스에서 ROWID(=테이블의 물리적 위치) 를 얻는다.
그 다음 실제 데이터(row)는 테이블에서 ROWID가 가리키는 블록을 하나씩 찍어서 가져온다

  • ROWID가 가리키는 테이블 블록은 여기저기 흩어져 있는 경우가 많다
  • 그래서 테이블 블록을 읽는 동작은 랜덤하게 점프하면서 읽는 형태(Random I/O) 가 된다

즉, “인덱스로 찾고 → 테이블을 찍어 읽는” 구조 자체가 테이블 쪽을 랜덤 I/O로 만든다

왜 “인덱스 블록 = Sequential I/O”인가

인덱스는 보통 B-Tree 구조이고, 조건 범위를 찾으면 리프(leaf) 블록을 앞에서 뒤로 이어서 스캔한다(리프 블록끼리 링크로 연결됨) 그래서 인덱스 블록(특히 leaf)은 연속적으로 읽히는 흐름(Sequential I/O) 이 잘 나온다

따라서 정답은 1번이다

정답 1번

버퍼캐시히트율(BCHR)이란

데이터베이스에서 필요한 데이터를 물리적 디스크 I/O 없이 메모리(버퍼 캐시)에서 얼마나 효율적으로 가져오는지를 나타내는 성능 지표로 보통 90~99% 이상의 높은 비율을 유지하는 것이 우수한 성능(낮은 디스크 I/O)을 보장한다
핵심 특징 및 관리
  • 높은 히트율 = 성능 향상: 캐시에서 데이터를 찾으면 디스크 I/O가 발생하지 않아 데이터 접근 속도가 매우 빨라짐
  • 저하 원인: 버퍼 캐시 크기가 너무 작거나, 비효율적인 SQL 쿼리(많은 데이터를 읽는 경우)가 원인
  • 개선 방법: SGA 영역의 DB 버퍼 캐시 크기를 늘리거나, SQL 튜닝을 통해 논리적/물리적 I/O 자체를 줄여야함
주요 공식 구성 요소
일반적으로 90% 이상의 히트율이 양호한 것으로 간주되며, 대규모 데이터베이스 환경에서는 더 높은 수치가 요구되기도한다
 

계산값 정리

  • disk = 50,000 → 물리적 I/O(디스크에서 읽음, Physical Reads)
  • query = 900,000 → 논리적 I/O(Consistent Gets)
  • current = 100,000 → 논리적 I/O(DB Block Gets)

즉, 논리적 I/O(Logical Reads) = query + current 로 본다

 BCHR(버퍼 캐시 히트율) 공식

BCHR(%) = (1 - (Physical Reads / Logical Reads)) × 100

여기서

  • Physical Reads = disk
  • Logical Reads = query + current

실제 계산해보기

Logical Reads

  • query + current
    = 900,000 + 100,000
    = 1,000,000

Physical Reads

  • disk = 50,000

BCHR

  • Physical / Logical = 50,000 / 1,000,000 = 0.05
  • 1 - 0.05 = 0.95
  • × 100 = 95%

따라서 정답은 95%로 1번이다

✔️블록 I/O란 무엇인가

데이터베이스는 데이터를 읽고 쓸 때 행(row) 단위가 아니라 블록(block, page) 단위로 처리한다 즉, 어떤 row 1개만 필요해도 그 row가 들어있는 블록 전체를 메모리(버퍼 캐시)로 가져와서 처리한다 이 “블록을 읽고 쓰는 동작”이 블록 I/O다.

✔️논리 I/O와 물리 I/O

쿼리가 블록을 읽는 경로는 두 가지다.

  • 논리 I/O(Logical I/O): 버퍼 캐시에 이미 있는 블록을 읽는 것(메모리에서 읽음)이다
  • 물리 I/O(Physical I/O): 버퍼 캐시에 없어서 디스크에서 블록을 읽어오는 것(디스크에서 읽음)이다

성능이 확 느려지는 구간은 보통 물리 I/O가 많아질 때다

✔️Random I/O vs Sequential I/O

블록을 읽는 “패턴”에 따라 두 가지로 나뉜다

Random I/O(랜덤 I/O)

필요한 블록이 여기저기 흩어져 있어 찍어가며 읽는 방식으로 인덱스 → 테이블 접근에서 많이 발생한다 인덱스에서 찾은 ROWID로 테이블 블록을 하나씩 방문하니 랜덤 성격이 강해진다

Sequential I/O(순차 I/O)

연속된 블록을 앞에서 뒤로 쭉 읽는 방식,테이블 전체 스캔(Full Table Scan) 처럼 큰 범위를 읽을 때 많이 발생한다

✔️Single Block I/O vs Multiblock I/O

이번에는 “한 번에 몇 개의 블록을 읽느냐” 기준이다

Single Block I/O(단일 블록 I/O)

한 번에 블록 1개를 읽는다 주로 인덱스를 통해 테이블을 액세스할 때 발생한다 (필요한 블록만 하나씩 찍어서 읽는 흐름)

Multiblock I/O(다중 블록 I/O)

한 번에 여러 블록을 묶어서 읽는다 주로 인덱스를 이용하지 않고 테이블 전체를 스캔할 때 발생한다 (어차피 쭉 읽을 거라면 여러 블록을 한 번에 가져오는 게 효율적이라서 그렇다)

✔️Direct Path I/O(버퍼 캐시 우회)

보통 DB는 읽은 블록을 버퍼 캐시에 올려 재사용하지만, 대용량 처리에서는 버퍼 캐시를 오염시키지 않기 위해 버퍼 캐시를 우회해서 읽거나 쓰는 경우가 있다 이때가 Direct Path I/O다 병렬 처리나 대량 스캔/로딩 같은 상황에서 자주 등장한다

 ✔️데이터 베이스 I/O 원리

  • 한 쿼리 내에서 같은 블록을 반복하여 액세스 하면 버퍼 캐시 히트율(BCHR)은 높아진다
  • Multiblock I/O는 한번의 I/O call로 여러 데이터블록을 읽어 메모리에 적재하는 방식이다
  • 테이블을 full scan할때는 테이블이 작은 Extent로 구성되있을수록 더 많은 I/O call이 발생한다

정답 3번

Sequential I/O 방식은 테이블이나 인덱스를 스캔할 때 사용한다 Random I/O 방식은 인덱스를 스캔하면서 테이블을 액세스할 때 사용한다