데이터베이스에서 I(Input)/O(Output)는 성능을 결정하는 중요한 요소이다.
🔹 논리적 I/O(Logical I/O)란?
논리적 I/O는 데이터베이스에서 데이터를 요청할 때 발생하는 논리적인 데이터 접근을 의미
즉, 사용자가 특정 데이터를 조회하거나 변경할 때, DBMS의 메모리(Buffer Cache)에 데이터가 있는지 확인하는 과정이 논리적 I/O
✅ 논리적 I/O의 특징
- 데이터 블록이 버퍼 캐시(Buffer Cache)에 존재할 경우, 디스크에서 읽지 않고 메모리에서 바로 조회함
- 디스크에 직접 접근하지 않음 → 성능이 상대적으로 빠름
- SQL 실행 시 블록을 읽는 횟수로 측정 가능 (consistent gets와 db block gets로 확인)
✅ 논리적 I/O의 종류
종류 | 설명 |
Consistent Get (일관된 읽기, 일관성 모드 읽기) | Undo 정보를 반영하여 커밋되지 않은 변경을 고려한 블록 읽기 (SELECT, WHERE 조건) |
DB Block Get (현재 블록 읽기, 최신 모드 읽기) | Undo 적용 없이 최신 블록을 읽는 경우 (INSERT, UPDATE, DELETE 시 사용) |
🔹 논리적 I/O 예제
select * from ecp where emp_id = 100
1️⃣ SQL이 실행되면, Buffer Cache에 데이터 블록이 있는지 확인 (논리적 I/O 발생)
2️⃣ Buffer Cache에 데이터가 있으면 즉시 반환 (디스크 접근 없음)
3️⃣ Buffer Cache에 데이터가 없으면 물리적 I/O 수행 후 버퍼에 적재
🔹 물리적 I/O(Physical I/O)란?
물리적 I/O는 디스크에서 데이터를 직접 읽거나 쓰는 I/O 작업을 의미합니다.
즉, 요청된 데이터가 메모리(Buffer Cache)에 존재하지 않을 때, 디스크에서 데이터를 읽거나 쓰는 과정입니다.
✅ 물리적 I/O의 특징
- 디스크에서 직접 데이터를 읽어야 하므로 속도가 느림
- Buffer Cache에 데이터가 없을 때 발생 (캐시 미스) → 성능 저하 원인
- physical reads로 측정 가능 (디스크에서 데이터를 읽은 횟수)
- 물리적 I/O를 최소화하는 것이 DB 성능 최적화의 핵심
✅ 물리적 I/O의 종류
종류 | 설명 |
Physical Read (디스크 읽기) | Buffer Cache에 데이터가 없을 경우, 디스크에서 데이터를 읽어옴 |
Physical Write (디스크 쓰기) | 변경된 데이터를 디스크에 저장 (DBWR 프로세스가 수행) |
🔹 물리적 I/O 예제
select * from emp where dep_id = 10
1️⃣ 데이터 요청 시, Buffer Cache에 데이터가 있는지 확인
2️⃣ Buffer Cache에 없으면, 디스크에서 데이터를 읽어와 Buffer Cache에 저장 (Physical Read 발생)
3️⃣ 이후 같은 요청이 오면 Buffer Cache에서 처리 (Logical I/O만 발생)
🔹 논리적 I/O와 물리적 I/O 비교
비교 항목 | 논리적 I/O(Logical I/O) | 물리적 I/O(Physical I/O) |
정의 | Buffer Cache에서 데이터 읽기 | 디스크에서 직접 데이터 읽기 |
속도 | 빠름 (메모리 접근) | 느림 (디스크 접근) |
발생 조건 | SQL 실행 시 항상 발생 | Buffer Cache에 데이터가 없을 때 발생 |
측정 지표 | consistent gets, db block gets | physical reads, physical writes |
최적화 방법 | 적절한 인덱스 활용, 효율적인 SQL 작성 | 캐시 히트율 증가, 디스크 I/O 최소화 |
🔹 I/O 성능 최적화를 위한 전략
1. 논리적 I/O 최적화
- 적절한 인덱스 사용
- WHERE 절에 자주 사용되는 컬럼에 인덱스를 적용하면 검색 범위를 줄여 논리적 I/O 감소
- SQL 튜닝
- SELECT * 대신 사용할 컬럼만 조회하여 불필요한 I/O 방지
- 조인을 줄이고, 서브쿼리를 최적화하여 I/O 최소화
- Bind Variable 사용
- 매번 SQL을 새로 파싱하지 않고, 같은 실행 계획을 사용하여 불필요한 I/O 감소
2. 물리적 I/O 최적화
- Buffer Cache 크기 조정
- 자주 사용되는 데이터를 캐시에 유지하여 물리적 I/O를 줄임
- 디스크 I/O 최소화
- 대량의 데이터 갱신 작업을 한 번에 수행하는 대신, Batch 처리하여 디스크 쓰기 최소화
- Tablespace, Redo 로그 최적화
- 물리적 I/O를 분산하여 특정 디스크에 과부하가 발생하지 않도록 조정
I/O 유형
🔹 1. Sequential I/O (순차적 I/O)
Sequential I/O는 디스크에서 연속된 블록을 순차적으로 읽거나 쓰는 I/O 작업입니다.
✅ 특징
- Random I/O보다 속도가 빠름
- 대량의 데이터가 연속된 공간에 저장된 경우 효율적
- Full Table Scan 또는 인덱스 범위 스캔(Index Range Scan) 시 발생
✅ 예제
select * from emp where dep_id between 10 and 30 order by dep_id
- 인덱스를 활용한 범위 검색 → 연속된 블록을 순차적으로 읽음 → Sequential I/O 발생
🔹 2. Random I/O (랜덤 I/O)
랜덤 I/O는 디스크의 여러 위치에서 데이터 블록을 비순차적으로 읽거나 쓰는 작업입니다.
✅ 특징
- 디스크 헤드가 여러 위치로 이동하며 읽기/쓰기 수행 → 속도가 느림
- 인덱스를 통한 검색이나 개별 행 조회 시 발생
- OLTP 시스템(트랜잭션 중심)에서 자주 발생 (빠른 응답 필요)
✅ 예제
select name from emp where emp_id = 100
- employee_id는 프라이머리 키(PK) 인덱스가 있음.
- 인덱스를 통해 랜덤한 위치에서 해당 블록을 찾아 데이터 조회 → Random I/O 발생
🔹 3. Direct Path I/O (직접 경로 I/O)
Direct Path I/O는 버퍼 캐시(Buffer Cache)를 우회하고, 데이터를 디스크에서 직접 읽는 방식입니다.
✅ 특징
- Buffer Cache를 사용하지 않음 → 물리적 I/O 부담 증가
- 대량의 데이터 처리 시 효과적
- 병렬 쿼리(Parallel Query) 또는 대용량 데이터 로드(Direct Load, Exadata Smart Scan)에서 자주 사용됨
✅ 예제
select /*+ PARALLEL(emp, 4) */ * from emp
- 병렬 쿼리 힌트(PARALLEL) 적용 → Direct Path I/O 발생
- 대량 데이터를 빠르게 읽어야 하므로 버퍼 캐시를 우회
🔹 4. Single Block I/O (단일 블록 I/O)
Single Block I/O는 한 번에 하나의 데이터 블록을 읽거나 쓰는 I/O 작업입니다.
✅ 특징
- 랜덤 I/O와 연관됨
- 인덱스를 이용한 검색, 특정 행 조회 등에서 발생
- 작은 크기의 데이터를 자주 액세스하는 OLTP 환경에서 중요
✅ 예제
select * from emp where emp_id = 150
- employee_id에 대한 인덱스 조회 → Single Block I/O 발생
- 한 개의 블록만 읽기 때문에 디스크 접근이 자주 발생
🔹 5. Multiblock I/O (멀티블록 I/O)
Multiblock I/O는 한 번에 여러 개의 데이터 블록을 읽거나 쓰는 방식입니다.
✅ 특징
- 대량의 데이터를 처리할 때 성능 최적화 가능
- Full Table Scan(전체 테이블 스캔) 시 주로 발생
- OLAP(분석용 쿼리) 환경에서 중요
- DB_FILE_MULTIBLOCK_READ_COUNT 파라미터 값을 조정하여 블록 크기 최적화 가능
✅ 예제
select * from emp
- Full Table Scan 수행 시, 한 번에 여러 블록을 읽어오므로 Multiblock I/O 발생
- OLTP 시스템보다는 DW(Data Warehouse) 환경에서 유용
- Random I/O는 비효율적이지만 OLTP 환경에서 필수적 (빠른 응답을 위한 트랜잭션)
- Direct Path I/O는 대용량 데이터를 한 번에 처리할 때 사용 (병렬 쿼리)
- Single Block I/O는 인덱스를 통한 개별 블록 접근 (랜덤 I/O)
- Multiblock I/O는 대량 데이터를 한 번에 가져올 때 사용 (Full Table Scan)
- Sequential I/O는 연속된 블록을 순차적으로 읽는 방식으로 가장 빠름 (OLAP 쿼리 최적화)
🔹 I/O 유형별 논리적/물리적 구분
I/O 유형 | 논리적 I/O | 물리적 I/O | 설명 |
Random I/O | ❌ | ✅ | 인덱스를 통한 랜덤한 디스크 접근 |
Direct Path I/O | ❌ | ✅ | 버퍼 캐시를 우회하여 디스크에서 직접 읽음 |
Single Block I/O | ✅ | ✅ | 인덱스 조회 시, 메모리에 있으면 논리적 I/O, 없으면 디스크에서 읽어 물리적 I/O |
Multiblock I/O | ✅ | ✅ | Full Table Scan 시, 메모리에 없으면 물리적 I/O 발생 |
Sequential I/O | ✅ | ✅ | 인덱스 범위 스캔 등에서 발생, 캐시에 있으면 논리적 I/O, 없으면 물리적 I/O |
'DataBase' 카테고리의 다른 글
[SQL] 인덱스 기본 사용법 (0) | 2025.03.10 |
---|---|
[SQL] 테이블 스캔, 인덱스 스캔 방식 정리 (0) | 2025.03.09 |
[SQL] 데이터베이스 저장 구조(Database Storage Structure) (1) | 2025.03.07 |
[SQL] 오라클 SGA(System Global Area) (2) | 2025.03.07 |
[SQL 튜닝/옵티마이저] 🎈오라클 힌트란? 간단한 사용 방법 (0) | 2024.07.08 |