여러 사람들의 이야기를 들어보니 Oracle의 Multi Buffer Pool 기능을 잘 사용하지 않는다고들 한다. 그런데 우리 사이트처럼 상당한 량의 Online Transaction과 Batch가 함께 도는 사이트에서는 Multi Buffer Pool이 유용하게 쓰일 수 있다.
일반적으로 KEEP Pool은 항상 read가 일어나야 하는 조그만 테이블들을 KEEP하는 용도라고 알려져 있다. 하지만 우리 사이트에서는 다르게 사용한다.
Batch와 Online에서 다 같이 많이 쓰는 "큰" 테이블/인덱스들을 KEEP에 올려놓는다.
1. table full scan 으로 테이블을 읽으면 touch count도 올라가지 않을 뿐 아니라 buffer cache의 끝부분에 올라갈 가능성이 높다. (http://ukja.tistory.com/133 참조) 하지만 상대적으로 여유가 많은 KEEP으로 보내게 되면 메모리에 좀 더 오래 머물러 있을 가능성이 높다.
2. 이 테이블을 online에서도 다양한 파라미터로 index range scan하거나 table access by rowid를 할 때 해당 블럭들은 touch count가 높아지면서 KEEP에 좀 더 오래 머물러 있을 가능성이 높아진다.
KEEP사이즈보다 더 크게 오브젝트를 KEEP해도 무방하다.
KEEP도 기본 버퍼풀과 동일한 알고리즘으로 움직인다. 모자라다고 해서 에러를 내지는 않는다. 오히려 이렇게 하는게 더 좋은 것 같다. full scan이 발생하는 테이블이라고 해서 언제나 모든 블럭이 메모리에 있어야 하는 것은 아니다. 그 중에서 range scan이 많이 들어오는 블럭들은 KEEP에도 오래 머물것이고, 다른 테이블에 대한 full scan이 들어올때는 touch count 가 높아져 있는 블럭들을 제외한 나머지 블럭들은 영역을 내줘도 괜찮은 것 같다.
Recyle Pool 에는 사이즈 크고 가끔 쓰는 테이블들을 올려놓는다.
이를테면 email 발송 솔루션의 발송 대상 테이블 같은 것들이다. (원래는 박스 자체를 분리해야하나..-_-)
이를테면 email 발송 솔루션의 발송 대상 테이블 같은 것들이다. (원래는 박스 자체를 분리해야하나..-_-)
정리하자면,
online과 batch가 함께 도는 환경에서는
1. onoline/batch에서 다 같이 자주 쓰는 "큰" 테이블은 KEEP
1. onoline/batch에서 다 같이 자주 쓰는 "큰" 테이블은 KEEP
2. batch에서만 가끔 쓰는 테이블은 Recycle에 넣어서 full scan의 영향도를 최소화하자.
(KEEP에 큰 테이블을 넣는 것은 사실 상식에 반하는 것인데.. 좀 더 검증이 필요하다. KEEP에 넣는 오브젝트들을 다양하게 조절하면서 v$buffer_pool_statistics, v$db_cache_advice의 변화를 계속 관찰하자.)
Posted by maceo

