지난번 포스트에서 인메모리(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)을 두어 처리하도록 하여 제한시간내에 처리되었는지 결과를 리턴받도록 되어 있습니다.
'IT관련' 카테고리의 다른 글
오라클 에러 정보 (ORA-00604) - 내부 SQL 처리에러, 다음 에러를 봐야하는 (0) | 2023.01.05 |
---|---|
오라클 In-memory (인메모리) 관련 유용한 스크립트 모음 (0) | 2022.12.22 |
오라클 Varchar2 타입 길이제한 4000 에서 32K 확장 (max_string_size 설정) (0) | 2022.11.10 |
오라클 Heatmap 정보 조회 및 Clear 하는 방법 (0) | 2022.11.09 |
오라클 In-memory (인메모리) 기능 소개 (Oracle을 메모리DB로 만들어주는) (0) | 2022.11.02 |