본문 바로가기

프로그래밍/DataBase

[Oracle] PGA와 SGA

최근 한국소프트웨어산업협회에서 주최하는 재직자 교육 중 류청하 강사님의 '데이터베이스 고도화 튜닝 과정'을 수료하였다. 개발자 입장에서도 알고있으면 좋을만한 내용들이 많았고, 해당 내용들을 까먹기 전에 내용을 복기하고자 오랜만에 블로그 글을 작성한다.

 

교육 내용이 Oracle기반의 내용이기 때문에 다른 데이터베이스에서는 구조가 조금 다르거나 명칭이 다른 부분이 있을 수 있다. 해당 내용들은 Orcale 기준의 내용임을 참고하자. 

 

 

오늘은 먼저 PGA와 SGA에 대해서 정리해보고자 한다.

 

** PGA(Program Global Area)란

PGA는 데이터베이스 서버에서 각 프로세스(작업 단위)가 일을 할 때 필요로 하는 메모리 영역이다.

쉽게 얘기하자면 데이터베이스 서버에서 작업을 처리할 때 사용하는 개인 전용 작업 공간이라고 생각하면 된다.

 

따라서 PGA는 비공유 메모리로서 독립적으로 할당된다. 

 

독립적으로 할당된 PGA라는 작업 공간에서는 1)정렬을 위한 임시공간으로 사용되거나 2)데이터 베이스가 복잡한 계산을 수행한 후, 그 결과를 잠시 보관하는 용도로 사용되게 된다.

 

데이터베이스는 PGA를 통해 각 작업 프로세스에 독립적인 메모리를 제공하여 데이터베이스 성능을 최적화하고 안정성을 높일 수 있게 된다.

 

1) PGA 메모리 구조

 

  • SQL Work Areas:
    데이터 정렬, 해시 작업, 비트맵 병합 같은 SQL 작업에 필요한 메모리를 제공한다.
  • Private SQL Areas:
    사용자 세션과 SQL 명령 실행을 지원하는 개별 메모리 영역이다.

** SGA(Shared Global Area)란

SGA는 데이터베이스 서버에서 모든 사용자가 공유하는 메모리 영역이다.

쉽게 얘기하자면, 데이터 베이스 전체가 공동으로 사용하는 공용 작업 공간이라고 생각하면 된다.

 

따라서 여러 사용자가 동시에 데이터베이스를 사용할 때, 데이터를 효율적으로 읽고, 캐싱하고, 관리할 수 있게된다.

 

 

공유 메모리인 SGA는 1)캐시를 사용해 디스크 접근 없이 자주 사용하는 데이터를 빠르게 읽고 쓸 수있고, 2) 여러 프로세스가 데이터를 공유해 중복 작업을 줄이고 자원을 절약할 수 있게된다. 또한 3)데이터 변경 사항을 Redo Log에 저장하여 장애 상황에서도 데이터를 복구할 수 있게 된다. 

 

2) SGA 메모리 구조

 

 

  • Database Buffer Cache
    데이터베이스에서 읽거나 쓰는 데이터를 임시로 저장하는 공간.
    • 예: 자주 조회되는 고객 정보를 미리 캐싱해 다음 조회 속도를 빠르게 만든다.
  • Shared Pool
    SQL 문장, 실행 계획, 데이터를 캐싱하는 공간.
    • 예: 동일한 SQL 문장이 반복 실행될 경우, 실행 계획을 새로 생성하지 않고 기존 캐시를 재사용한다.
  • Redo Log Buffer
    데이터베이스 변경 작업(INSERT, UPDATE, DELETE 등)을 기록하는 공간.
    • 예: 정전이나 장애가 발생했을 때 데이터를 복구할 수 있도록 변경 내용을 저장한다.
  • Large Pool (선택적 구성)
    대규모 작업, 백업, 복원 작업에 필요한 메모리 공간.
    • 예: 데이터베이스 백업 시 필요한 메모리를 따로 관리해 다른 작업에 영향을 주지 않음.
  • Java Pool (선택적 구성)
    데이터베이스에서 Java 코드를 실행할 때 사용하는 메모리 공간.

 

 

사용자 요청이 있을 때, 위에서 설명한 PGA와 SGA가 어떤 프로세스를 거치게 될까?

 

1. SGA만 동작하는 경우

SGA는 데이터 캐싱 및 공유 작업을 주로 처리하므로, 캐시된 데이터만으로 작업이 가능한 경우에는 PGA가 필요하지 않다.

  • 예: 단순 데이터 조회 작업
    • 사용자가 "고객 목록 보기"와 같이 단순히 데이터를 조회하는 SQL 쿼리를 실행했을 때:
      1. SGA의 Database Buffer Cache에서 요청한 데이터가 이미 캐싱되어 있다면, PGA의 추가 연산 없이 데이터를 바로 반환한다.
      2. 이 경우, 데이터베이스는 SGA만을 활용해 빠르게 요청을 처리한다.


2. PGA만 동작하는 경우

PGA는 개별 프로세스의 연산 및 작업 처리에 사용되므로, SGA의 도움 없이 프로세스 내부에서 작업이 독립적으로 처리될 수 있다.

  • 예: 프로세스 내부에서만 필요한 임시 작업
    • 서버 프로세스가 사용자 요청과 상관없이 내부적으로 특정 데이터를 정렬하거나 계산하는 작업을 수행할 때:
      1. 이 작업이 외부 데이터베이스 캐시나 변경 내용과 연관되지 않는다면, PGA의 Sort AreaRuntime Area만 사용된다.
      2. 예: 사용자와 연결되지 않은 배치 작업(백그라운드에서 실행되는 프로세스)이 임시 데이터를 처리하는 경우.


3. PGA와 SGA가 상호작용하는 경우

대부분의 데이터베이스 요청은 PGA와 SGA가 상호작용하며 동작하게된다. 이는 SGA가 데이터를 준비하고 관리하며, PGA가 개별 작업을 처리하는 방식으로 이루어진다.

  • 예: 복잡한 SQL 쿼리
    • 사용자가 "고객 데이터를 이름순으로 정렬하고, 총 구매 금액이 높은 순으로 그룹화"와 같은 복잡한 쿼리를 실행했을 때:
      1. SGA 역할:
        • Shared Pool에서 SQL 실행 계획 확인 및 생성.
        • Buffer Cache에서 데이터를 읽거나 디스크에서 데이터를 가져옴.
      2. PGA 역할:
        • Sort Area에서 데이터를 정렬.
        • Hash Area에서 데이터를 그룹화 및 계산.

 

'프로그래밍 > DataBase' 카테고리의 다른 글

[DataBase]시퀀스  (0) 2021.04.21
[DataBase]뷰  (0) 2021.04.19
[DateBase]테이블 복사  (0) 2021.04.07
[DateBase]그룹함수  (0) 2021.04.05
[DataBase]일반 함수  (0) 2021.03.31