본문 바로가기

Oracle/Oracle Admin

Database Oracle Administrator_PGA의 구성요소

Step 1. Oracle Server 전체 구조 살펴보기

- Sub : Program Global Area(PGA)의 주요 구성 요소

 

PGA를 어제 바로 올릴까 했었지만.. 좀 개념적인 부분과 버전별로 좀 다른 것 같아서 공부좀 다시 하다가 올리네요 ㅎ

책에 있는 것과 인터넷, 메뉴얼, E-KIT 내용과 그림이 좀 헷갈리게 있어서 저도 좀 혼돈이... 똑같은 11g 릴리즈 2인데..

우선 공통적인 부분과 제가 이해한부분, 책에 나온 명확한 부분을 올리도록 하겠습니다 ㅎ

PGA의 역할은 같으니까요 ㅎㅎ 변하지 않죠

PGA(Program Global Area)라는 아이는 무엇일까요? SGA의 약자는 무엇이었나요? System Global Area 였습니다.

SGA는 시스템에 관련된 것이었다는것, 그럼 PGA는? 프로그램에 관련된 것이겠다는 생각이 들죠 ㅎ

왜 SGA를 언급했을까욤ㅎㅎ SGA는 여러 Process들이 공통적으로 쓰는 부분입니다.

하지만 PGA는 개별적인 공간이라고 보시면 됩니다. SGA는 교실이라면 PGA는 개인 사물함 같은 ㅎ

다시 말하자면 PGA는 각 개별 Process마다 각각 저장 해야할 내용을 담고 있는 것입니다. 주로 정렬과 같은 내용을 담습니다.

 

Oracle Server를 돌아다니는 Process들은 다 각각 PGA를 가지고 있습니다.

 

 

이 그림과 같이 Server Process들은 PGA와 연관되어서 돌아다닙니다. 이렇게 밀접한 관계가 있다는 거죠 ㅎ

그중에 PGA만 포함하는 Instance PGA부분을 한번 살펴보도록 하겠습니다.

 

 

 

 

이것이 PGA의 각 요소입니다.

위 그림에서 보이는 것처럼 SQL Work AreasPrivate SQL Area, Session Memory 이렇게 큰 세덩어리가 존재합니다.

SQL Work Areas에는 Sort Area, Hash Area, Bitmap Merge Area 이렇게 세가지로 나누어 지고

Private SQL Area에는 Persistent Area, Runtime Area 두가지로 나누어집니다.

 

이제 이것들에 대해서 설명을 하도록 해야겠죠?ㅎ 궁금증이 막 치밀어 오르지 않나요 ㅎ

먼저 Session Memory부터 시작을 해보겠습니다.

Session Memory의 역할은 User Process로부터 SQL문장을 전달받은 Server Process가 자신에게 작업을 요청한 User Process의 정보를 저장하는 공간입니다. 일종의 고객목록을 저장하는 곳이라고 생각하면 좋겠죠 ㅎ

A라는 고객(User Process)이 상품(Data)을 보려고 직원(Server Process)을 부릅니다. 불러서 주문(SQL)을 하죠. 그럼 고객의 말을 알아들은 직원이 주문대로 상품을 가져다 줍니다. 단, 직원은 고객을 기억해야하는데 바쁘면 적어서 기억할 수 있겠죠? 그때 쓰이는 것이 Session Memory라는 겁니다 ㅎ

 

다음 옆에 있는 Private SQL Area입니다. 뭔가 벌써부터 개인적인 것이라고 생각이 되지 않나요? 하긴 그렇게 따지만 PGA자체가 개인이죠..ㅎ Private SQL Area에는 두가지가 있다고 했습니다. Prevate SQL Area의 전체적 역할은 두가지를 포함하기 때문에 Bind 변수값 보관 및 Query 실행 상태정보와 Query를 수행하면서 임시로 정보를 저장하는 경우 이 공간을 사용합니다.

그럼 세분화해서 Persistent Area는? 위에서 말한 Bind 변수가 존재 할 경우 저장하는 공간입니다. 그럼 Bind 변수란 무엇일까요?

Bind는 SQL 동작 원리중 두번째 동작입니다. 바로 뒤 포스팅에서 말할거긴한데..ㅎ 간단히 말하자면 SQL의 변수를 사용자로부터 입력 받는데 입력받는 변수라고 생각하면됩니다. 조건! 이라고 생각하면 편하죠 ㅎ

Runtime Area는 그럼 뭘까요? 앞에서 말했듯이 Query의 상태정보와 Query의 데이터 임시 저장입니다. 상태정보는 알겠는데 임시저장을 왜할까요? 사용자에게 출력되어야 할 정보가 100개입니다. 100개를 다 모을때까지 기다리면서 임시저장 하는 곳이 Runtime Area입니다.

 

Private SQL Area 위에 SQL Work Area를 살펴보도록 하겠습니다. 이 부분은 주로 정렬 관련작업이나 해시 작업이 있을 경우 사용하는 부분입니다. 이곳의 용량을 결정하는 것은 8i까지 수동이었습니다. SORT_AREA_SIZE, HASH_AREA_SIZE, BITMAP_MERGE_SIZE, CREATE_BITMAP_SIZE 같은 파라미터로 말이죠. 하지만 9i 부터는 자동으로 조정이 가능한 기능이 나왔습니다.

PGA크기를 Oracle Server가 자동으로 관리하는 것인데 초기화 파라미터에 PGA 총량 파라미터인 PGA_AGGREGATE_TARGET의 값을 설정하고 WORKAREA_SIZE_POLICY 파라미터를 AUTO로 하면 자동으로 관리가 됩니다. 수동으로 하고싶으면 WORKAREA_SIZE_POLICY를 MANUAL로 하시면 수동으로 제어가능합니다.

 

한가지 더 알아야 할 사항은 PGA_AGGREGATE_TARGET의 값이 하나의 Server Process가 쓸 수 있는 총량이 아니라는 것입니다. 100M를 주었다고 100M 다쓰는 것이 아니라 _SMM_MAX_SIZE 파라미터의 값대로 하나의 Server Process 용량이 정해지는 것입니다.

단, 직렬작업과 병렬작업의 사이즈가 각각 상이합니다. 그럼 적절한 PGA 용량은 어떻게 계산할 수 있을까요?

 

OLTP와 DSS로 구분지어서 가능합니다.

우선 OLTPOLAP(DSS)가 무엇인지부터 알아야겠죠? 정확한 구분은 데이터베이스의 용도입니다.

OnLine Transaction Processing(OLTP)는 실시간으로 DB 데이터를 트랜잭션 단위로 갱신/조회하는 처리방식입니다.

은행이나 증권사에서 많이 쓰이는 방식입니다.

 

DSS(Decision Support System)는 OLAP(OnLine Analysis Processing)이라고 하는데요. 주로 대용량 읽기 기능을 하는 처리 방식입니다.

 

간단히 정리하면 데이터를 읽고 쓰는데 초점을 맞춘 OLTP, 데이터 읽고 쓴것을 모아모아 분석을해서 의미있는 형태로 만들기 위한 도구인 OLAP(DSS)가 되겠습니다. 데이터베이스 용도라서 저도 좀 헷갈리긴 하는데 이정도로 정리하는게 맞는 거 같습니다.

 

돌아와서 용량을 계산해보도록 하겠습니다.

OLTP의 경우 PGA_AGGREGATE_TARGET = ((총 물리 메모리 용량) * 80%) * 20%

DSS의 경우 PGA_AGGREGATE_TARGET = ((총 물리 메모리 용량) * 80%) * 50%

정확한 것은 아니지만 튜닝개념에서 나오는 것이라 운영 시스템에 맞게끔 설정해야한다는 것!

현재 Server의 PGA와 관련된 값을 조회하려면 V$PGASTAT 뷰를 조회하면 됩니다.

 

 

 

이렇게요 ㅎ 이번 PGA부분은 좀 이해되지 않는 튜닝부분과 파라미터부분이 있어서 어려웠네요..ㅎ

무작정 책을 따라가기보단 다른것도 참고해서 하니까 헷갈리기도 @_@;;ㅎㅎ

이렇게 STEP 1이 끝이 나고 다음 포스팅부터는 SQL 문장의 실행 원리로 들어가겠습니다. 중요하니 자세히 다룰겁니다!

다음으로 뿅