본문 바로가기

IT관련

오라클 In-memory (인메모리) 기능 사용방법

지난번 포스트에서 인메모리(In-memory) 에 대한 기본적인 개념에 대해 알아봤습니다.

이번에는 이 인메모리 기능을 사용하기 위해서 Oracle DB 에서 설정하는 방법을 확인해보겠습니다.

 

인메모리 기능은 Oracle DBMS 내에 이미 내장되어 있기 때문에 추가로 뭘 더 설치하거나 하는 것은 필요없습니다.

단지, DBMS 내에 인메모리로 사용할 메모리 공간을 확보해주고, alter table 구문으로 테이블 설정만 변경해주면 됩니다.

 

* DB에 인메모리 파라메타 세팅
      > alter system set inmemory_size = 1G scope=spfile;
                 // DB버전은 12.1.0.2 이상이어야 함.
                 // INMEMORY_SIZE 파라메타 값을 100M 이상으로 설정해야 함. (설정후 restart 필요)

 

 

오라클 SGA 내에 inmemory 공간이 확보되었으면, 이제 테이블 설정만 바꿔주면 됩니다.

이때 파티션 테이블의 경우에는 파티션단위로 인메모리 설정을 지정할 수 있습니다. 아래 구문에서 alter table 을 alter partition 으로 바꿔주면 됩니다.

 

* In-Memory 설정 방법 예시
      > alter table EMP inmemory;
      > alter table EMP inmemory priority critical;
                 // Population 우선순위 지정 : critical / high / medium / none
      > alter table EMP inmemory memcompress for query high;
                 // 압축방식 지정 : no / dml / query low / query high / capacity low / capacity high
      > alter table EMP inmemory no memcompress;
                 // 압축방식 no 는 구문이 좀 다름.
      > alter table EMP no inmemory;
                 // unpopul 커맨드는 없음. 이렇게 no inmemory 로 설정해야 함.

 

가장 간단하게는 맨위에 있는 것처럼 inmemory 키워드만 뒤에 붙여주면 됩니다. EMP 테이블에 inmemory 기능을 사용하겠다고 지정(선언)하는 것입니다.

 

이때 메모리에 적재할때(Population) 우선순위는 디폴트인 none 으로, 압축방식은 디폴트인 query low 로 잡히게 됩니다.

메모리에 적재하는 것을 Population 이라고 하는데, 이것도 테이블이 여러개인 경우는 어떤 테이블을 먼저 적재할지 순위를 지정하기 위해서 critical, high, medium, none 의 구분이 있는 것입니다.

 

메모리에 적재할때 압축해서 메모리 사용량을 절약할 수 있는데, 이때 압축방식도 다양하게 존재합니다.

압축을 안한다고 해서 무조건 빠른 것은 아닙니다. 압축을 하면 전체 데이터양이 적어지기 때문에 한꺼번에 읽는 양도 줄어드는 장점이 있기 때문입니다.

 

 

위에서는 테이블의 설정을 inmemory 기능을 사용하겠다고 선언하기만 한 것이고,

실제로 인메모리 기능을 이용하기 위해서는 테이블이 메모리에 적재되어야 합니다. 이것을 Population 이라고 합니다.

priority 가 none 이 아닌 경우에는 백그라운드 프로세서들(w000)에 의해 자동으로 알아서 Population 이 이루어집니다.

따라서 아래과정이 필요없고, none 으로 설정된 경우는 아래와 같이 Population 을 수동으로 해줘야 합니다.

 

* Population 방법 예시
      > select /*+ full(t) */ count(*) from EMP t;
      > exec dbms_inmemory.populate(schema_name => 'SCOTT', table_name => 'EMP');
      > select dbms_inmemory_admin.populate_wait(priority => 'NONE', percentage => 100, timeout => 300)
         from dual;
                  // 300초(5분) 안에 끝나지 않으면 -1 리턴, 0 은 정상

 

위에 3개를 모두 해야하는게 아니라 3가지 방법이 있는 것이고, 어떤 방법으로 하든 결과는 같습니다.

첫번째 방법처럼 테이블을 한번만 Full Table Scan 해주면 Population 이 됩니다.

이것을 프로시져로 만들어둔게 두번째 방법입니다.

세번째 populate_wait() 는 여러개의 테이블을 동시에 Population 하는 함수를 호출하는 방식입니다.

이때 제한시간(timeout)을 두어 처리하도록 하여 제한시간내에 처리되었는지 결과를 리턴받도록 되어 있습니다.