# 데이터 사전 저장장치 (DB – User DB, System DB)
- Data Dictionary, System Catalog
저장 정보 :
- 테이블 이름
- 테이블 칼럼 이름
- 컬럼의 도메인
- 각 테이블의 레코드 수
- 각 테이블의 저장 방법(클러스터링, 비 클러스터링 등)
- 각 테이블의 저장 구조(순차, 해시, 힙)
- 뷰 이름과 이에 대한 정의 내용
- 무결성 제약조건(개체 무결성, 참조 무결성 제약조건, 도메인)
- 권한이 부여된 사용자 이름
- 사용자 인증을 위한 비밀번호
- 인덱스 이름
- 인덱스 된 테이블 이름
- 인덱스가 정의된 속성
- 인덱스 형태
# 데이터베이스 버퍼
- DBMS의 주요 목적 중 하나: 디스크와 주기억장치 사이의 블록 전송 수 최소화
- 최소화 방법 : 주기억장치에 가능한 한 많은 블록을 유지 디스크 접근 횟수 줄임
- 주기억장치에 블록을 저장하기 위한 별도의 공간: 버퍼(Buffer)
- 디스크상의 해당 내용은 버퍼에 있는 내용보다 더 오래된 것일 수 있음
- 버퍼관리: 버퍼 관리자(Buffer Manager)
- OS Block < DBMS Block 정수배 더 큼
- Block 단위로 IO 이루어짐
- 메인메모리 접근 안 하면 속도 빨라짐
- PGA(program global area) : 디비에서 가져온 값들을 보관
- SGA : instance가 관리하는 디비의 공간. 안에 DB Buffer 존재
- 프로그램들이 바로 디스크 접근 못함. 디비 버퍼를 통해 받음
- 레코드 하나만 원해도 블록 단위로 가져옴
# 버퍼 관리자
- 데이터베이스 시스템의 프로그램들은 디스크로부터 블록을 가져올 필요가 있을 때 버퍼 관리자를 호출
- 버퍼관리자는 해당 블록이 버퍼에 있으면 그 주소를 요구자에게 전달
- 없으면 버퍼에 해당 블록을 저장하기 위하여 공간을 할당 후 주소를 요구자에게 통보
- 경우에 따라서는 버퍼에 있던 다른 블록을 디스크에 내보내기도 함
- 보내진 블록이 디스크에 있는 내용보다 더 최신의 것이면 이를 디스크에 기록
- 레코드 달라고 DB에 요구. 버퍼 메모리 상에 있으면 블록 내에 있는 레코드 줌. 버퍼 안에 없으면 버퍼 매니저가 디스크에 가서 데이터 매니저에 얘기해서 해당 블록 가져오라고 함.
- write(insert, delete, update) 요구 시 해당 블록이 버퍼 안에 있는지 확인. 있으면 버퍼 안의 블록에 적음(디스크에는 안 적힘. 똑같은 블록인데 다른 내용임)
해당 블록이 버퍼에 없으면 디스크에 해당 블록 가져온 후 내용 적음(디스크에는 안적힘)
# 버퍼 교체 전략(Buffer Replacement Strategy)
- 원하는 블록이 버퍼에 없고 버퍼에 남아 있는 공간이 없을 경우 기존 블록을 하나 제거하고 디스크로 보냄(교체)
- LRU(Least Recently Used): 가장 오래전에 참조된 블록을 제거
# 붙박이 블록(Pinned Block)
- 가장 자주 사용(data dictionary) -> 핀 꽂아둠
- 디스크에 내려가지 않도록 특정 블록을 지정
# 블록 강제 출력(Forced Output of Blocks)
- 버퍼에 공간을 요구하지 않는 상황에서도 버퍼 내용을 강제로 디스크에 기록할 필요가 있음
- 바뀐 내용을 강제로 적어줌(반영)
- 일치시키는 작업
- 복구할 때 시간을 줄이기 위함(check point 하는 주기를 줌)
- 디스크 비휘발성(전원 나가도 내용 유지됨)
# 버퍼 교체 방법
- OS에서 일반적으로 운영하는 버퍼교체방법: LRU(과거 접근 패턴을 보고 만든 전략)
- 데이터베이스시스템에서는 OS보다 정교한 고찰이 필요함
- DBMS는 사용자 요구 연산을 수행하기 위하여 요구된 각 절차를 세부적으로 관찰하여 어느 블록이 요구될 것인가를 결정
- 예) select * from instructor natural join department;
두 테이블은 별도의 블록에 저장되었다고 전제
DBMS가 아래와 같은 구조로 처리할 계획을 가지고 있다면(하나의 행에 대해 모든 행 처리)
for each record i of instructor do
for each record d of department do …
if i[dept_name] == d[dept_name] ….
- instructor의 한 레코드가 처리되었을 경우 바로 반납 해당 레코드가 차지하고 있는 블록은 버퍼에서 즉시 비움. 다시 사용되지 않음 : Toss-Immediate
- department 레코드 블록 중 가장 오래 전에 접근된 블록을 지움
=> LRU(가장 오래 전에 사용된 것) 보다 MRU(가장 최근에 사용된 것)가 더 적절함
- MRU를 보다 확실하게 동작하도록 하기 위해서는 현재 처리되고 있는 department 블록을 버퍼 공간에 고정(pin) 시킴 => 처리 후 이를 풀면 해당 블록이 MRU가 됨