미스터 역마살
[ORCLE] 데이터베이스 아키텍처 본문
1. 데이터 베이스란?
오라클에서의 정의는 디스크에 저장된 데이터 집합(Datafile, Redo Log File, Control File등) 임.
2. 프로세스
프로세스는 서버프로세스와 백그라운드 프로세스로 나뉘게 되는데 서버프로세스는 사용자가 지시한 각종 명령들을
처리하고 백그라운드 프로세스는 말 그대로 백그라운드에서 묵묵히 주어진역할을 수행한다.
2-1. 서버프로세스
서버프로세스의 역할은 SQL을 파싱하고 최적화를 수행하며, 커서를 열어 SQL을 실행하면서 블록을 읽고, 읽은
데이터를 정렬해서 클라이언트가 요청한 결과집합을 만들어 네트워크를 통해 전송하는 작업들을 처리한다.
2-2. 백그라운드 프로세스
백그라운드 프로세스는 Dirty 버퍼와 로그버퍼를 디스크에 기록하고 인스턴스 및 프로세스를 복구하는 등 각 프로세스
별로 주어진 역할을 수행한다.
3. 파일구조
3-1. 데이터 파일
물리적으로는 데이터파일에 데이터를 저장하고 관리한다.
3-1-1. 블록(Block)
오라클에서의 I/O는 블록단위로 이루어 진다. 데이터를 읽고 쓸때의 논리적인 단위가 블록인 것이다. 블록단위로 I/O를 한다는 것은 하나의 레코드에서 하나의 컬럼만을 읽으려 할때도 레코드가 속한 블록전체를 일게 됨을 뜻한다.
SQL 성능을 좌우하는 가장 중요한 성능지표는 엑세스하는 블록개수이며 옵티마이저의 판단에 가장 큰 영향을 미치는
것도 엑세스해야 할 블록 개수다.
3-1-2. 익스텐트(Extent)
데이터를 읽고쓰는 단위는 블록이지만서도 테이블 스페이스로 부터 공간을 할당하는 단위는 익세텐트다. 테이블이나 인덱스에 데이터를 입력하다가 공간이 부족해지면 해당 오브젝트가 속한테이블 스페이스(불리적으로는 데이터파일) 로 부터 추가적인 공간을 할당 받는데, 이때 정해진 익스텐트 크기의 블록을 할당받는다.
3-1-3. 세그먼트(Segment)
세그먼트는 테이블, 인덱스, Undo 처럼 저장공간을 필요로 하는 데이터베이스 오브젝트다. 저장공간을 필요로한다는 것은 한개 이상의 익스텐트를 사용함을 뜻한다.
테이블을 생성할 때, 내부적으로는 테이블 세그먼트가 생성되고, 인덱스를 생생할때는 내부적으로 인덱스 세그먼트가 생성된다. 한 세그먼트는 자신이 속한 테이블 스페이스 내 여러데이터 파일에 걸쳐 저장될 수 있다. 즉, 세그먼트에
할당된 익스텐트가 여러 여러 데이터 파일에 흩어져 저장되는 것이며, 그래야 디스크 경합을 줄이고 i/o 분산 효과를 얻을 수 있다.
3-1-4. 테이블 스페이스(Table Space)
테이블 스페이스는 세그먼트를담는 콘테이너로서, 여러데이터 파일로 구성된다. 사용자는 세그먼트를 위한
테이블 스페이스를 저장하고 DBMS는 실제 값을 저장할 데이터 파일을 선택하고 익스텐트를 할당한다.지금까지 설명한 내용을 요약하면 다음과 같다.
3-2. 임시데이터 파일
임시 데이터 파일은 특별한 용도로 사용된다. 대량의 정렬이나 해시작업을 수행하다가 메모리 공간이 부족해지면 중간 결과 집합을 저장하는 용도다. 임시데이터 파일에 저장되는 오브젝트는 말 그대로 임시로 저장했다가 자동으로
삭제된다.
3-3. 로그파일
DB 버퍼캐시에 가해지는 모든 변경사항을 기록하는 파일을 오라클은 'Redo 로그' 라고 부른다. 로그 기록은 Append 방식으로 이루어 지며 대부분의 dbms는 버퍼블록에 대한 변경사항을 건건이 데이터 파일에 기록하기보다 우선 로그파일에 Append 방식으로 빠르게 기록하는 방식을 사용한다. 그리고 나서 버퍼블록과 데이터 파일 간 동기화는 적절한 수단(DBWR, Checkpoint)을 이용해 나중에 배치 방식으로 일괄 처리한다.
3-3-1. Online Redo 로그
캐시에 저장된 변경사항이 아직 데이터 파일에 기록되지 ㅏㄶ은 상태에서 정전등으로 인스턴스가 비정상 종료되면,
그때까지의 작업내용을 모두 잃게 된다. 이러한 트랜잭션 데이터의 유실에 대비하기 위해 오라클은 온라인 리그로그를 사용한다. 마지막 체크포인트 이후부터 사고 발생 직전까지 수행되었던 트랜잭션들을 리두로그를 이용해 재현하는 것
이며 이를 '캐시 복구' 라고 한다. 또한 온라인 리두로그는 최소 두개이상의 파일로 구성된다. 로그를 계속 써나가다가
모든 파일이 꽉차면 첫번째 파일부터 재사용하는 라운드 로빈 방식을 사용한다.
3-3-2. Archived(=offline) Redo 로그
Archived Redo 로그는 오라클에서 온라인 리두로그가 재사용 되기 전에 다른 위치로 백업해 둔 파일을 말한다. 디스크가 깨지는 등의 물리적인 저장매채에 문제가 생겼을때 데이터베이스 복구를 위해 사용된다.
4. 메모리 구조
- 시스템공유 메모리 영역
시스템 공유 메모리는 말그대로 여러 프로세스가 동시에 엑세스 할 수 있는 메모리 영역으로서 SGA라고 부른다.
- 프로세스 전용 메모리 영역
오라클은 프로세스 기반 아키텍처 이므로 서버프로세스가 자신만의 전용 메모리 영역을 가질 수 있는데
이를 PGA라 고 부르며 데이터를 정렬하고 세션과 커서에 대한 상태정보를 저장하는 요도로 사용한다.
4-1. DB 버퍼캐시
DB 버퍼캐시는 데이터 파일로 부터 읽어 들인 데이터 블록을 담는 캐시 영역이다. 인스턴스에 접속한 모든사용자
프로세슨느 서버 프로세스를 통해 DB 버퍼 캐시의 버퍼블록을 동시에(내부적으로는 버퍼 LOCK을 통해 직렬화 함)
엑세스 할 수 있다. 모든 블록 일기는 버퍼캐시를 통해 이루어진다. 즉, 익고자 하는블록을 먼저 버퍼 캐시에서
찾아보고 없을때 디스크에서 가져와 읽는다. 디스크에서 읽을때도 먼저 버퍼캐시에 적재한 후에 읽는다.
버퍼블록의 상태
- Free 버퍼 : 인스턴스 가동 후 아직 데이터가 읽히지 않아 비어있는 상태이거나 데이터가 담겼지만 데이터 파일과
서로 동기화돼 있는 상태여서 언제든지 덜어 써도 무방한 버퍼블록을 말한다.
- Dirty 버퍼 :버퍼에 캐시된 이후 변경이 발생했지만, 아직 디스크에 기록되지 않아 데이터 파일 블록과 동기화가
필요한 버퍼 블록을 말한다.
- Pinned 버퍼 : 읽기 똔느 쓰기 작업이 현재 진행 중인 버퍼블록을 말한다.
4-2. 공유풀(Shared Pool)
- 딕셔너리 캐시 : 딕셔너리는 테이블, 인덱스 같은 오브젝트는 물론 테이블 스페이스, 데이터 파일, 세그먼트, 익스텐트,
사용자, 제약에 관한 메타정보를 저장하는 곳이다. 따라서 딕셔너리 캐시는 말 그대로 딕셔너리
정보를 캐싱하는 메모리 영역이다.
- 라이브러리 캐시 : 사용자가 수행한 SQL문과 실행 게획, 저장 프로시저를 저장해 두는 캐시 영역이다.
4-3. 로그버퍼
DB 버퍼 캐시에 가해지는 모든 변경사항을 로그파일에 기록한다고 설명했는데 로그 엔트리도 파일에 곧바로 기록하는 것이 아니라 먼저 로그버퍼에 기록한다.건건이 디스크에 기록하기보다 일정량을 모았다가 기록하면 훨씬 빠르기 때문이다.
4-4. PGA
각 오라클 서버 프로세스는 자신만의 PGA 메모리 영역을 할당 받고, 이를 프로세스에 종속적인 고유 데이터를 저장하는 용도로 사용한다. PGA는 다른 프로세스와 공유되지 않는 독립적인 메모리 공간으로서, 래치 매커니즘이 필요없어 똑같은 개수의 블록을 읽더라도 SGA 버퍼캐시에서 읽는 것보다 훨씬 빠르다.
-끝-
'Database > ORACLE' 카테고리의 다른 글
[SQLP] 아키텍처 기반 튜닝원리 (0) | 2016.08.06 |
---|---|
[ORACLE] TRACE 보는 방법 (0) | 2016.08.03 |
[ORACLE]인덱스 파티셔닝 (0) | 2016.07.27 |
[오라클] 테이블 파티셔닝(Table Partitioning) (0) | 2016.07.26 |
[ORACLE] 인덱스 사용이 불가능한 경우와 인덱스 스캔방식의 종류 (0) | 2016.07.23 |