✅ DBMS 구조와 Buffer 관리, Steal & No-Force 정책 이해하기
✅ 1. DBMS 구조
① 사용자 인터페이스 (User Interface)
- 사용자가 SQL 문을 입력하는 창구.
SELECT
, INSERT
, UPDATE
, DELETE
와 같은 SQL을 전달.
② 쿼리 처리기 (Query Processor)
SQL을 분석하고 실행 계획을 세우는 단계.
- 파서 (Parser): SQL 문법 검사.
- 옵티마이저 (Optimizer): 가장 효율적인 실행 계획 수립.
- 실행 엔진 (Execution Engine): 실제 SQL 실행.
③ 스토리지 매니저 (Storage Manager)
데이터를 안전하고 빠르게 꺼내거나 저장하는 역할.
- 버퍼 매니저 (Buffer Manager): 디스크 → 메모리에 페이지 단위로 데이터 로딩 (Buffer Pool 관리).
- 트랜잭션 매니저: 트랜잭션 관리.
- 락 매니저: 동시성 제어.
- 로그 매니저: 장애 복구용 (Redo, Undo 처리).
④ 디스크에 저장된 데이터 (Physical Storage)
✅ 2. Buffer와 Buffer Page
DBMS는 디스크에 있는 데이터를 통째로 가져오지 않고, 페이지(Page) 단위로 잘라서 메모리로 가져옴.
이 데이터를 담는 메모리 공간을 Buffer Pool(버퍼 풀) 이라 하고,
메모리에 올라온 한 페이지를 Buffer Page(버퍼 페이지) 라고 함.
👉 버퍼 페이지에서 데이터를 수정 후, 필요에 따라 디스크에 다시 기록.
✅ 3. Buffer 관리 정책이 중요한 이유
수정된 데이터를 디스크에 언제, 어떻게 저장할지에 따라 복구 방식이 달라지기 때문!
이때 필요한 복구 작업이 바로 UNDO와 REDO.
✅ 4. UNDO, REDO 개념
구분 | 내용 | 이유 |
---|
UNDO | 실패한 트랜잭션이 수정한 데이터를 되돌림 | 트랜잭션 중 수정한 데이터가 디스크에 저장됐을 수 있기 때문 |
REDO | 성공한 트랜잭션의 작업을 다시 반영 | 커밋했지만, 데이터가 디스크에 저장되지 않았을 수 있기 때문 |
✅ 5. Buffer 관리 정책 (정책에 따라 UNDO, REDO 발생)
✅ UNDO 관련 정책
정책 | 설명 | 특징 |
---|
Steal | 트랜잭션이 끝나기 전에 수정된 페이지를 디스크에 기록 가능 | ✅ UNDO 필요 (많은 DBMS 사용) |
No-Steal | 트랜잭션이 끝날 때까지 디스크에 쓰지 않음 | ❌ UNDO 필요 없음 (대신 버퍼 공간 많이 차지) |
✅ REDO 관련 정책
정책 | 설명 | 특징 |
---|
Force | 트랜잭션 종료 시 수정된 페이지를 무조건 디스크에 기록 | ❌ REDO 필요 없음 (I/O 부하 ↑) |
No-Force | 트랜잭션이 끝나도 디스크에 안 쓸 수 있음 | ✅ REDO 필요 (대부분의 DBMS 사용) |
✅ 6. DBMS는 왜 Steal + No-Force 정책을 사용할까?
✅ 이유 1) 버퍼 크기의 한계
- No-Steal이면 트랜잭션 끝날 때까지 수정된 페이지를 버퍼에 계속 보관해야 함.
- 여러 트랜잭션이 동시에 실행되면 버퍼 공간이 금방 부족.
- 그래서 Steal을 사용해 버퍼가 부족할 때만 디스크에 페이지를 내보내서 공간을 확보.
✅ 이유 2) 성능 저하 방지
- Force를 사용하면 트랜잭션이 끝날 때마다 디스크에 기록 → 디스크 I/O 부하 심각.
- 버퍼의 캐싱 효과도 사라짐 (디스크에 쓰면 캐시 유지 의미가 줄어듦).
- 그래서 No-Force를 사용해 트랜잭션 종료 후에도 바로 디스크에 쓰지 않음 → 성능 향상.
✅ Steal을 쓰면 캐싱 효과가 떨어지는 거 아닌가?
👉 그렇지 않음!
- Steal은 버퍼가 부족할 때만 디스크에 쓰기 때문에,
- LRU 같은 버퍼 교체 알고리즘을 이용해 자주 쓰는 페이지는 최대한 버퍼에 유지.
- 그래서 Steal을 사용해도 캐싱 효과를 유지하면서 공간을 확보할 수 있음.
✅ ✅ 최종 요약
정책 | 이유 | 발생 복구 |
---|
Steal | 버퍼 공간 확보 | ✅ UNDO 필요 |
No-Force | 디스크 I/O 줄이고 성능 향상 | ✅ REDO 필요 |
👉 그래서 대부분의 DBMS는 Steal + No-Force 조합을 사용합니다! 🚀