오라클은 데이터베이스와 이를 액세스하는 프로세스 사이에 SGA(System(Shared) Global Area)라는 메모리 캐시 영역을 두고있다.

디스크를 경유한 입출력은 물리적으로 액세스 암이 움직이면서 헤드를 통해 데이터를 읽고쓰지만 메모리 캐시를 통한 입출력은 전기적 신호로 디스크 I/O보다 월등히 빠르다.
오른쪽의 개많은 프로세스들이 동시에 데이터를 액세스하기때문에 사용자 데이터를 보호하는 Lock은 물론, 공유 메모리 영역인 SGA상에 위치한 데이터 구조에 대한 액세스를 직렬화 하기 위한 LOCK 매커니즘 (=Latch)도 필요하다.
오라클은 블록 단위로 읽고, 저장할 때도 변경이 발생한 블록만 찾아 블록 단위로 저장한다.
오라클은 백그라운드에서 DBWR와 CKPT 프로세스가 캐시와 데이터파일 간 동기화를 주기적으로 수행해준다 (자동저장이라고 생각하자)
오라클에서는 디스크에 저장된 데이터 집합 (Datafile, Redo Log File, Control File 등)을 데이터베이스라고 부른다.
그리고 SGA 공유 메모리 영역과 이를 액세스하는 프로세스 집합을 합쳐서 인스턴스라고 부른다.

프로세스 집합을 서버 프로세스와 백그라운드 프로세스 집합으로 나눌수있다.
서버 프로세스는 전면에서 사용자가 던지는 명령을 처리하고 (프론트라고 생각 근데 왜 이름이 서버야 헷갈리게) 백그라운드 프로세스는 SQL파싱, 최적화, 실행, 결과집합 생성, 전송 등을 한다.(백엔드라고 생각)
못한 부분은 OS, I/O 서비시스템, 백그라운드 프로세스 등에 신호를 보내 일을 처리한다.

위 그림에서 제일 중요한건 리스너에 연결요청하는 순간 하나의 프로세스를 띄우고 (fork) PGA(Process Global Area) 메모리에 할당한다는 것. 근데 이게 엄청 비싼 작업이라 매번 연결요청하면 안되겠죠? 그래서 접속하는 애플리케이션을 구축할 때 반드시 커넥션 풀 기능이 필요하다.
커넥션 풀은 한번 커넥션 맺으면 작업을 완료해도 해제하지 않고 서버에 Pooling하다가 반복 재사용 (재사용성)

오라클은 하나의 데이터베이스에 접근하는 하나의 인스턴스가 생성되지만 RAC(Real Application Cluster) 환경에서는 하나의 데이터베이스를 액세스하는 다중 인스턴스로 구성된다. 또한 공유 캐시 방식을 지원한다. 글로벌 캐시 개념을 사용해서 로컬 캐시에 없는 데이터 블록을 이웃 노드에 전송받아 서비스한다.
심지어 아직 커밋하지 않은 Active 상태의 블록까지도 디스크를 경유하지 않고 Dirty 버퍼상태에서 네트워크를 통해 공유같으며 수행한다.
뭔 좋은건 다 때려박았다.
RAC이전에 OPS환경에서는 타 노드에 캐싱된 Dirty 버퍼를 읽고자할때 디스크로의 쓰기 작업이 선행되어야했고. 이처럼 디스크를 거치는 동기화 과정을 핑 Ping이라고 한다. 우리가 아는 그 핑맞음 ㅇㅇ
'SQLP > 오라클 성능 고도화 원리와 해법' 카테고리의 다른 글
| [오성고원해] 인덱스 원리와 활용 (2) (0) | 2025.03.15 |
|---|---|
| [오성고원해] 인덱스 원리와 활용 (1) (0) | 2025.03.09 |
| [오성고원해] 4. Redo (0) | 2024.10.02 |
| [오성고원해] 3. 버퍼 Lock (0) | 2024.10.01 |
| [오성고원해] 2. DB 버퍼 캐시 (1) | 2024.10.01 |