새소식

300x250
3. Database/Oracle 기본

[Oracle] SGA (System Global Area, 시스템 공유 영역)

  • -
728x90
SGA (System Global Area : 시스템 공유 영역)




SGAOracle이 시스템으로부터 자원을 할당 받아 관리하는 Oracle 시스템 영역이다.
데이터 베이스의 Instance가 시작되면 시스템으로부터 자원을 할당 받고, 데이터베이스 Instance가 종료되면 할당 받은 자원을 시스템에 반환한다. Instance가 시작된다는 것은 메모리의 일부를 SGA의 영역으로 할당 받고, CPU로부터 PROCESS 자원도 할당 받았음을 의미한다.

 

 

메모리 영역 관리

Oracle데이터 베이스 서버는 자주 사용하는 데이터를 메모리에 오래 저장하여 I/O 효율을 높이고, 자주 사용하지 않는 데이터는 데이터 파일에 물리적으로 저장하여 SGA영역을 효율적으로 관리한다. 이를 LRU (Least Recently Used) 알고리즘이라고 한다.

 

관련 용어 정리
MRU(Most Recently Used) End : 가장 최근에 접근한 버퍼 영역으로 주로 데이터를 검색할 때 이용한다.
LRU End :  가장 이전에 접근한 버퍼 영역으로 주로 Free Buffer를 검색할 때 이용한다.
Free Buffer : 아무것도 저장되어 있지 않은 버퍼 영역
Pinnced Buffer : 현재 엑세스 되고 있는 데이터를 저장하고 있는 버퍼영역
Dirty Buffer : 변경된 데이터를 저장하고 있는 버퍼 영역, Write List로 옮겨지게 된다
Aging : 하나의 시스템 내에서의 모든 프로세스는 균등하게 자원을 할당 받아 사용할 수 있어야 한다. 같은 시간에 한정된 시스템 자원을 요청한 프로세스들은 요청한 시간 별로 우선순위를 두어 그 자원의 사용권을 할당해 주는 시스템 내부 알고리즘

 

사용자의 프로세스의 요청으로 Oracle 서버 프로세스는 데이터베이스 버퍼 캐시를 읽게 된다. 여기서 읽은 데이터베이스 버퍼를 MRU End에 이동시킨다. 그리고 다른 버퍼들은 aging 하여 LRU End쪽으로 계속해서 이동 된다. 결국 자주사용하는 데이터는 오래 메모리에 보존, 나머지는 aging 되어 데이터 파일에 저장하게 된다. 이러한 알고리즘을 통해 Oracle은 한정된 시스템 메모리를 효율적으로 관리한다.

 

1.1 데이터베이스 버퍼 캐시 (DATABASE BUFFER CACHE)
데이터베이스 버퍼 캐시는 메모리 영역의 집합을 말한다.

Oracle 서버에 접속한 사용자들이 데이터를 요청하면 서버 프로세스는 데이터베이스 버퍼 캐시를 먼저 확인한다. 요청한 데이터가 있으면 데이터베이스 버퍼 캐시로부터 데이터를 읽어 반환하고 없으면 데이터 파일로부터 해당 데이터를 읽어 데이터베이스 버퍼 캐시에 저장한 후 요청한 데이터를 돌려 주게 된다.

이때 디스크 I/O가 발생하면서 데이터베이스 성능이 저하 된다. 그렇기 때문에 가능한 디스크 I/O로부터 발생하는 성능 저하를 피하기 위해 항상 적정한 크기의 데이터베이스 버퍼 캐시가 필요하게 된다.

 

버퍼 캐시의 데이터 관리


버퍼 캐시는 dirty buffer로 구성된 wirte listLRU list로 구성되어 있다.
LRU listfree buffer, pinned buffer, dirty buffer로 이루어져 있다.
버퍼 캐시 메모리 영역에 저장되거나 변경된 데이터들은 LRU 알고리즘에 의해 버퍼 캐시에 보존되며, dirty buffer가 되어 wirte list로 이동하게 된다. 그리고 한정된 버퍼 캐시 내에서 서버 프로세스가 더 이상 free buffer들을 찾을 수 없을 때 DBW0 프로세스에 신호를 보내게 되고 DBWR프로세스가 write listdirty buffer들을 데이터 파일에 저장한다.

 

1.2 공유 풀 영역(SHARED POOL AREA)
공유 풀은 사용자가 작성한 SQL문이 저장되어 관리 되는 곳.

어떤 역할을 하나?


표준 SQL 문법에 합당한 문장인가?
Ex) select * fro emp;
from이 아닌 fro 을 썼기 때문에 표준 SQL 문법에 맞지 않고 에러를 발생하게 된다.

 

데이터 사전(Data Dictionary)의 정보를 검색하여 데이터베이스에 생성되어 있는 테이블인가?
Ex) select * from emp;
접속한 해당 사용자가 질의할 수 있는 emp 테이블이 존재하지 않는다면 오류를 발생한다.

 

해당 테이블에 현재 접속한 사용자는 접근 권한이 있나?
Ex) select * from scott.emp;
권한이 불충분하면 오류를 발생한다.

 

짧은 시간 안에 위와 같은 사항들을 확인하고 있다. 그리고 동일한 SQL문이 다시 실행될 때 확인된 SQL문을 재사용 하기 위해 SQL문을 Libarary Cache(라이브러리 캐시)내에 저장한다. 동일한 SQL문을 사용한다면 위와 같은 작업을 확인하는 시간과 자원을 아낄 수 있기 때문이다.
( 참고 select * from emp; SELECT * from EMP; 는 우리가 보기엔 같은 문장이지만 Oracle은 서로 다른 문장으로 생각한다. 즉 대소문자 구분하여 생각한다. )

 

SQL문에 대한 검사를 마친 후 실행시 가장 빠른 검색경로를 통해 데이터를 얻기 위해 실행 계획을 세우게 된다. 이 실행 계획에 따라 사용자가 요구한 SQL문을 처리하며 질의문인 경우 결과를 반환한다.

 

1.3 리두 로그 버퍼 (REDO LOG BUFFER)
데이터베이스 장애 발생 시 복구를 위해 모든 변경된 정보와 원래의 원본 정보들을 저장하는 버퍼.
리두 로그 버퍼는 지정된 크기만큼의 데이터를 메모리에 저장하고 있다가 이를 온라인 리두 로그 파일에 저장한다.
리두 로그 버퍼의 크기가 크다면 메모리 상에서 데이터를 보유할 수 있는 가능성이 크므로, 온라인 리두 로그 파일의 I/O를 줄일 수 있고 복구 시간을 최소화 할 수 있다.
데이터베이스의 버퍼 캐시 내의 데이터는 트랜잭션에 의해 데이터가 변경되어도 곧바로 저장되지 않는다. 어떤 사고(정전 등)가 발생하여 데이터베이스가 비정상적으로 종료 되면, 데이터베이스의 버퍼 캐시 안의 저장되지 않은 변경 데이터는 리두 로그 파일에 의존하여 비정상적으로 종료된 시점까지 복구할 수 있게 된다.

 

1.4 자동화된 공유 메모리 관리
이전 Oracle 버전 (10.g 이전) 에서는 관리자가 초기화 파라미터의 값을 통해 SGA를 구성하는 각 요소의 크기를 지정해주었다. 예를 들면 데이터베이스 관리자가 SHARED_POOL_SIZE, DB_CACHE_SIZE에 각각 값을 할당해 주었다. Oracle 데이터베이스 10g 이상은 자동화된 공유 메모리 관리 기능이 있어 SGA의 메모리 관리를 쉽게 할 수 있도록 지원한다.
관리자는 SGA_TARGET이라는 초기화 파라미터를 이용하여 Instance에 사용가능한 SGA 메모리의 전체 크기를 정한다. 그러면 Oracle 데이터베이스는 가장 효율적으로 메모리를 사용할 수 있도록 SGA에 할당된 전체 크기로부터 자동으로 메모리를 분배한다.
자동 SGA 메모리 관리 기능이 가능하면, 상이한 SGA 요소들의 크기는 추가적인 어떤 설정 없이 필요한 작업의 요구에 따라 적용된다. 이때 데이터베이스는 총 SGA 크기 내에서 이용 가능한 메모리 자원을 분배한다. 예를 들면 1GB의 메모리 크기면 다음과 같이 자원의 사용이 가능하다.
SHARE_POOL_SIZE = 128M
DB_CACHE_SIZE = 896M


300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.