[오라클] SGA 요소 및 구조 개념 이해하기
- 해시 함수, 해시 버킷: 동일 SQL이면 동일 해시 함수값을 가진다. 오브젝트 핸들 개념 참고. 검색 시간 감소시킬 수 있다. 해시 함수 인자값은 SQL에서 해시 함수에게 제공된다. 즉 SQL을 ASCII로 변환한 값을 제공한다. 그러므로 대/소문자를 가리는 것에 주의한다. 이것은 파싱이 불가능하다.
"동일 SQL의 조건"이라는 말의 의미는, 내용, 대/소문자, 띄어쓰기, 오브젝트 소유자가 동일해야 한다는 의미이다.
- 재사용: 구문 분석X, 실행 계획 수립X, 전체 런타임 감소시킨다. 자원 사용 감소시킨다.
- 페이지 교체 기법: LRU, FIFO, LIFO
- LRU 동작 순서: SQL 실행 -> (SQL에 대한)파싱 정보 -> 공유 풀의 여유 공간 확인 -> 테이블 저장
사용 가능 공간을 "free chunk"라 한다. LRU는 메모리에 관한 컨셉이다(디스크가 아니라). MRU 엔드 포인트쪽부터 다 쓴 메모리가 적재되어서 공간 확보 시에는 우측 끝인 LRU 엔드 포인트의 메모리 블록을 비움으로써 공간을 확보한다(FIFO). 공간을 확보할 때는 우선 요청이 필요하다. 예를 들어, 유저 B가 메모리 블록 할당을 요청한다. 유저 B는 라이브러리 캐시를 사용하고 싶은데 프리 리스트에 가능한 것이 없으므로 요청하는 것이다. 그렇게 되면, 우선 LRU 엔드쪽을 비워서 유저 B가 사용할 수 있게한다. 사용 완료 시, MRU 엔드로 들어간다.
만약 이 때, 유저 C가 등장하여 이것과 동일한 SQL을 실행한다면, 조금 전의 MRU 엔드로 들어간 메모리 블록을 꺼내서 '재사용'한다. 그리고 사용이 완료되면 메모리 블록은 MRU 엔드로 이동한다.
- 데이터베이스 버퍼 캐시: 서버 프로세스, DBWR 백그라운드 프로세스가 사용하는 캐시이다. 디스크에서 데이터베이스 버퍼 캐시로는 서버 프로세스가 액세스한다. 그 반대는 DBWR이 메모리에서 수정된 데이터를 목적지인 디스크로 저장한다.
- 오라클의 I/O 단위: 데이터 블록
- 다중 데이터 블록의 크기 설정은 신중하게 해야한다. 테이블 간의 이동을 고려해야 하기 때문이다. 데이터 블록 크기가 크면, 한 번의 캐싱으로 재사용 확률이 높다. 반면, 크기가 작으면 경합과 사용율이 줄어든다. 또한 하나의 디스크 I/O가 추출하는 데이터양도 줄어든다. 최근 디스크 성능이 높아지고, 메모리 용량도 커져서 데이터 블록의 크기는 8K를 권장한다.
- 다중 데이터베이스 버퍼 캐시
종류: 기본(default, nK or 8K), 고정(keep, 재사용률 높다), 재사용(recycle, 재사용 낮고, 짧은시간 내 제거). 이 셋은 크기의 차이가 존재하나, 메모리 관리 알고리즘은 동일하다. 크기가 큰 캐시는 데이터 블록을 메모리에 더 오래 유지한다. 크기는 keep, default, recycle 순으로 크다. 다중 데이터베이스 버퍼 캐시의 사용은, 테이블의 메모리 적중률을 높이지만, 테이블의 데이터 활용 특성 파악이 필요하다.
- 리두 로그 버퍼: 롤백은 작업 전으로 복구한다(언두 포함)는 의미이고, 복구는 장애에 대한 복구(리두+언두)를 의미한다.
-로깅: 오라클은 데이터베이스 로깅 시 physiological 로깅을 사용한다. 이는 변경 데이터의 전/후 이미지를 저장, 명세서를 작성한다. 오라클이 physical, logical아닌 해당 로깅을 사용하는 이유는, 로그양이 physical 로깅보다 적고, logical 로깅보다 복구 능력이 좋기 때문이다.
- Write-ahead 로깅(또는 로그 ahead): 이것의 역할은, 로그를 기록하는 작업을 먼저한다. DML 작업(INSERT, DELETE등) 시 데이터의 변경에 대한 내용을 "먼저" '리두 로그 버퍼'에 미리 저장한다. 즉 로그를 미리 기록, 작업 중 장애에 대비(복구)하는 용도이다.
- 선(先)로그 기법의 종류: 논리 버퍼 어헤드, 로그 파일 어헤드.
- redo copy latch, redo allocation latch 두 개의 latch 획득하고, 버퍼 공간이 있어야 버퍼에 로깅할 수 있다. 만약 버퍼 공간이 없을 시, writing latch 획득 후 LGWR 기동한다. 참고로 데이터베이스당 writing latch는 유일하다. LGWR 기동 시 버퍼 내용을 파일에 기록하고 플러싱하여 버퍼의 여유 공간을 확보한다. 그 후 버퍼에 못 쓴 로그를 기록 시도한다.
- 정합성: 공유자원(메모리, 오브젝트)을 동시 변경금지한다. 락 매커니즘으로 정합성을 유지할 수 있다. latch, enqueue 두 가지가 대표적인 락 매커니즘이다.
- 공유자원: SGA. PGA는 아님. 그래서 SGA에 많은 latch존재한다.
- SGA 필수 영역: 공유 풀, 데이터베이스 버퍼 캐시, 리두 로그 버퍼
SGA 필수 아닌 영역: 라지 풀
- 라지 풀: 해당 풀 사용으로 공유 풀 부하를 감소시킬 수 있다. 또한, 병렬 프로세싱 수행 시 반드시 라지 풀을 설정해야 병렬 효과를 얻을 수 있다.
- 자바 풀: 자바 명령 파싱에 사용한다.
- 스트림 풀: 테이블을 복제하고 이벤트를 다른 데이터베이스로 전송한다. 심지어 오라클 외 RDBMS로 복제/전송이 가능하다.
- 공유 메모리 자동 관리: MMAN. 낮에는 온라인 업무가 메인이고, 밤에는 배치 업무 수행이 메인인 환경이 존재할 수 있다. 동적으로 메모리를 관리하면 목적에 맞게 관리 가능하다(자동관리 안되는 항목: 고정 영역, 다중 블록 데이터베이스 버퍼 캐시(기본, 고정, 재활용 모두 포함), 리두 로그 버퍼). 자동 관리의 장/단점은 명확한 편이다.