
정답 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가 발생하지 않아 데이터 접근 속도가 매우 빨라짐
- 저하 원인: 버퍼 캐시 크기가 너무 작거나, 비효율적인 SQL 쿼리(많은 데이터를 읽는 경우)가 원인
- 개선 방법: SGA 영역의 DB 버퍼 캐시 크기를 늘리거나, SQL 튜닝을 통해 논리적/물리적 I/O 자체를 줄여야함
계산값 정리
- 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 방식은 인덱스를 스캔하면서 테이블을 액세스할 때 사용한다
'🐢 꼬부기 LV.1 | 개념•기초 > 💧물대포(핵심개념)' 카테고리의 다른 글
| BCrypt 개념과 구조 (0) | 2026.03.08 |
|---|---|
| AJAX와 fatch (0) | 2026.03.07 |
| sqld 자격검정 실전문제 과목3 문제풀이 1~10 (0) | 2026.02.28 |
| PAT 와 SSH (0) | 2026.02.27 |
| SQLD 자격검정 실전문제 과목2 문제풀이 111~126 (0) | 2026.02.25 |