대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 KEEP BUFFER 활용 방안
등록일 조회수 5311
첨부파일  

KEEP BUFFER 활용 방안

㈜엑셈 컨설팅본부 /DB컨설팅팀 장 정민



개요

Oracle 은 유저가 요청한 작업을 빠르게 처리하기 위해 Buffer Cache 라는것을 사용한다 . B uffer Cache 는 SGA 에 위치하고 있으며 , 오라클 인스턴스에 접속하는 모든 프로세스에 의해 공유된다 . 이 Buffer Cache 는 오라클 I/O 관리의 핵심으로 자주 사용하는 데이터 파일의 블록 들을 메모리에 상주시킴으로써 물리적인 I/O Operation 을 줄이는 역할을 한다 . Buffer Cache 를 효과적으로 사용하면 물리적 I/O 가 줄어들고 자연스럽게 I/O 성능문제를 해결할 수 있다 .

오라클의 버전이 올라감에 따라 Buffer Cache 를 처리하는 알고리즘은 끊임없이 개선되었고 , 더불어 새로운 관리 방법들이 제공되었다 . Oracle 7 까지의 Buffer Cache 는 하나의 틀로서 운 영되었고 , 각 Object 의 특성에 따른 차별적인 Buffer Cache 이용이 어려웠다 . 이런 면을 해결 하기 위해 Oracle 8 부터 Multiple buffer pool 이라는 기능을 지원하게 되었는데 , 이로 인해 각 Object 의 특성이나 엑세스 빈도 등 차별성을 고려하여 Buffer Cache 를 보다 세밀하 게 관리 할 수 있게 되었다 .

Keep Buffer 는 이 Multiple Buffer Pool 을 구성하는 여러 영역중의 하나이다 .


KEEP Buffer 사용 목적 및 특성

Keep Buffer 의 사용 목적은 본래의 Buffer Cache 의 목적과 마찬가지로 , Object 를 메모리에 상주시킴으로써 물리적인 I/O 를 피하는데 있다 .

Keep Buffer Pool 과 Default Buffer Pool 이 데이터 블록을 Cache 하거나 Flush 할 때 서로 다 른 알고리즘을 사용하지는 않는다 . 그럼에도 불구하고 하나였던 Buffer Cache 영역을 Multiple Buffer Pool 로 나누게 된 이유는 Object 의 특성을 고려한 Buffer Cache 이용을 위함이다 .

KEEP Buffer 의 메모리 공간은 Sequential 하게 관리된다 . 한번 KEEP 된 세그먼트는 KEEP Buffer 의 메모리 공간을 모두 할당하기 전까지 메모리에 유지되다가 KEEP Buffer 공간을 모두 할당하게 되면 , 가장 오래된 블 록부터 default pool 로 밀려난다 . 때문에 KEEP 대상이 되는 세 그먼트들의 사이즈를 정확히 계산하여 KEEP Buffer 크기를 적절히 할당해야 한다 .


KEEP Buffer 사용 순서

Keep Buffer 의 사용은 다음과 같은 순서로 진행한다 .

1. KEEP 대상 선정하기
2. OS Memory & SGA 공간 확인
3. KEEP Buffer 설정
4. 테이블 / 인덱스 속성 변경
5. 테이블 / 인덱스 Keeping
6. KEEP 효율성 체크
7. KEEP 대상 선정 기준


KEEP 대상 선정 하기

KEEP 대상 선정에 있어서 명확한 기준점은 없다 . 실제 업무를 고려하여 각 DB 의 운영환경에 맞는 대상을 선정해야 한다 . 만약 KEEP 하는 대상이 아주 빈번하게 사용되는 블록 이라면 , 기본 적인 Default Buffer 를 사용해도 Cache 돼있을 가능성이 높은데 , 이런 경우에는 Keep Buffer 사용이 성능상의 이점을 가져오지 못한다 . 반대로 자주 사용되지 않는 블록을 Keep Buffer 에 상주시킨다면 , 사용하지 않는 메모리를 가지고 있 는 것이기 때문에 전반적인 성능을 저하시키는 요인이 될 수도 있다 .

때문에 Keep 대상을 선정하는데 있어서는 실제 업무의 고려가 필수적이다 . 예를 들어 하루에 1 번만 수행되는 프로그램인데 어떻게 해서든 수행시간을 단축시켜야 하는 경우나 , 많은 업무를 처리하는 시간대에 꼭 수행 되야 하는데 많은 I/O 때문에 병목현상을 일으켜서 시스템 에 전반적 으로 악영향을 끼치는 프로그램 등 이 있을 수 있다 . 이런 프로그램들이 사용하는 Object 들이 Keep 대상이 될 수 있 다 . 그러나 위와 같은 업무 프로그램에 사용되는 모든 세그먼트를 KEEP Buffer 에 상주 시킬 수 는 없다 . 그러므로 KEEP Buffer 에 상주시킬 대상은 각 DB 운영환경을 고려하여 선정해야 한다 . 이외에도 크기 , DML 빈도 , 데이터 엑세스 빈도에 따라 Keep 하기에 적 절한 세그먼트들이 존재한다 .



선정 기준 [1]. 프로그램 중요도

Keep 대상 선정에 있어서 가장 중요한 부분이 바로 해당 세그먼트를 조회하는 업무 프로그램의 중요도 이다 . 해당 프로그램이 중요하지 않다면 굳이 Keep Buffer 를 사용해야 할 필요가 없다 . 반대로 해당 세그먼트를 조회하는 프로그램이 중요도가 아주 높고 어떻게든 수행시간을 단축해 야 한다면 프로그램 수행 빈도와 상관없이 KEEP 대상으로의 선정을 고려할 수 있다 .

선정 기준 [2]. 세그먼트 크기

세그먼트 크기가 일정하지 않고 , 과다하게 커지는 세그먼트는 Keep Buffer 의 효율성을 떨어뜨 릴 수 있다 . Keep 된 세그먼트는 Keep Buffer 의 용량이 부 족하면 오래된 블록부터 Default Buffer 로 밀려나게 되는데 , 크기가 계속 커지는 세그먼트가 Keep Buffer 에 존재한다면 타 세 그먼트를 조회하는 프로그램의 성능 저하를 가져올 수 있기 때문이다 . 따라서 일정한 사이즈 또 는 변동 량이 심하지 않으면서 최대 크기가 일정 수준 이하인 경우의 세그먼트를 선정하는 것이 바람직하다 . 예를 들면 ‘ 최대 크기가 10 만 블록 이하인 세그먼트 ’ 같은 기준을 정할 수 있다 .

선정 기준 [3]. Full Tabl e Scan & Index Full Scan & Index Fast Full Scan

KEEP Buffer 에 KEEP 된 세그먼트를 조회할 때 효율성을 극대화 하기 위해서는 다소 많은 량을 처리해야 하는 경우이다 . Scan 범위가 넓은 비효율 Index Scan 이나 Full Table Scan, Index Fast Full Scan 으로 처리되는 세그먼트가 대상이 될 수 있다 .

KEEP 대상 선정 SQLScript



OS Memory & SGA 공간 확인

OS Memory SGA 공간 확인 SQLScript



SGA 공간 확인 SQLScript

● SGA 전체 size 확인



● Data Buffer size 확인



KEEP BUFFER 설정

KEEP Buffer 설정은 KEEP Buffer 크기와 SGA 여유공간에 따이 문서의 스크립트는 S GA 영역의 메모리 관리를 수동으로 하는 경우를 바탕 으로 작성 하였다 .

KEEP Buffer 설정 Script


테이블 / 인덱스 속성 변경

테이블 / 인덱스 속성 변경 Script



테이블 / 인덱스 Keeping

Segment 의 Buffer Pool 이 KEEP 으로 설정된 테이블과 인덱스는 Query 시 KEEP Buffer 에 해당 세그먼트의 블록을 로딩하게 된다 . 그러므로 최초 세그먼트를 Loading 할 때에는 Disk I/ O 가 발생하게 된다 . 만일 처음 실행하는 때를 포함하여 모든 Application 의 조회에서 Disk I/O 를 제거하고 싶다면 , 업무가 진행되기 전에 해당 세그먼트들을 Full Table Scan 이나 Index Fast Full Scan 으로 KEEP Buffer 에 로딩시키면 된다 .


KEEP Buffer 효율성 판단

KEEP Buffer 의 사용에 명확한 기준이 정해져 있는 것이 아니라 운영 환경에 따라 차이가 존재 한다 . 때문에 모든 운영 환경에서 같은 방법 으로 효율성을 판단하기에는 무리가 있다 . 하지만 다 음과 같은 자료 들이 KEEP Buffer 의 효율성을 판단하는데 근거가 될 수 있다 .


KEEP Buffer Size & Hit Ratio SQLScript

만약 KEEP Buffer 를 사용하는 Segment 크기의 총 합이 KEEP Buffer 크기보다 작 은 경우 , 해 당 Segment 들의 크기가 더 이상 커지지 않는다면 , 한 번 KEEP 영역으로 올라간 Segment 의 Cache Hit Ratio 가 100% 에 가깝게 될 것이다 .

만일 KEEP Buffer 의 크기 가 해당 영역을 사용하는 Segment 들의 크기보다 작다면 KEEP Buffer 영역에서 경합이 발생하고 , 그로 인해 Physical I/O 가 발생하여 Cache Hit Ratio 가 떨 어질 수 있다 . 이때 KEEP Buffer 의 크기를 늘려주거나 중요도가 떨어지는 Segment 의 KEEP Buffer 사용을 막는 방안을 고려 해 볼 수 있다 . 반대로 KEEP Buffer 의 크기가 Segment 들의 크기보다 많이 크다면 , 사용하지 않는 메모리 공간을 차지하고 있는 것이므로 KEEP Buffer 의 크기를 줄 이는 것을 고려 해 볼 수 있다 . 따라서 시스템 성능과 Segment 들의 중요도에 따라 효 율적인 KEEP Buffer 의 크기 조절이 필요하다 .

다음 스크립트로 dba_hist_seg_stat 뷰를 조회하여 Segment 조회시 발생하는 I/O 발생량에 대한 AWR 정보를 확인 하여 Segment 별 효율성을 판단 할 수 있다 .


Segment I/O SQLScript

2. 결론

KEEP Buffer 를 사용하는데 있어 가장 중요한 것이 업무의 반영일 것이다 . 자주 사용하는 Object 들만 상주하는 Buffer Cache 하나만 사용하는 것이 시스템 전체의 관점에서 보면 효율 적일 수도 있다 . 하지만 업무의 중요성이나 특성을 고려한다면 다른 결과가 나올 수 있다 . 적게 실행 되더라도 중요도가 높은 업무가 있을 수 있고 , 수행시간 단축이 매우 중요한 업무가 있을 수 있다 . 이러한 업무에 대한 특성을 반영한 운영계획을 세우는데 있 어서 , KEEP Buffer 를 효율 적으로 사용 할 수 있다면 , 시스템 성능 향상에 큰 도움이 될 것이다 .



출처 : (주)엑셈

제공 : DB포탈사이트 DBguide.net