본문 바로가기

Database/Oracle Database

처음 사용자를 위한 Oracle Database In-Memory 사용 가이드 - #7. 참고. IM FastStart 수행 확인

"처음 사용자를 위한 Oracle Database In-Memory 가이드" 시리즈를 통해 Swingbench의 분석 업무 스키마 ‘SH’ 데이터를 이용해서 오라클 21c Single 인스턴스 데이터베이스와 RAC 데이터베이스에서 간단한 In-memory 옵션 사용 방법을 살펴봅니다.

 

글 순서

#1. Introduction

#2. 테스트 환경 준비

#3. In-Memory Advisor

#4. In-Memory 테스트 – Single 인스턴스 DB: In-Memory 설정 & Population

#5. In-Memory 테스트 – Single 인스턴스 DB: In-Memory 수행 확인

#6. 참고. 칼럼 레벨 In-Memory 설정 및 In-Memory hybrid scan

#7. 참고. IM FastStart 수행 확인

#8. In-Memory 테스트 – RAC DB: In-Memory 설정 & Population

#9. In-Memory 테스트 – RAC DB: In-Memory 수행 확인

#10. In-Memory 테스트 – RAC DB: Auto DOP 적용 테스트

#11. In-Memory 테스트 – RAC DB: Distribute For Service 테스트

 

In-Memory FastStart

In-Memory FastStart (IM FastStart)는 칼럼 포맷 데이터(IMCU)를 디스크에 직접 저장함으로써 데이터베이스를 보다 빠르게 오픈하는 기능으로 인스턴스 장애나 복구 이후 데이터베이스가 IM FastStart 영역을 읽어들인다.

DBMS_INMEMORY_ADMIN.FASTSTART_ENABLE 프로시저로 IM FastStart를 enable시키면, 내부적으로 Space Management Worker 프로세스가 (Wnnn) “SYSDBinstance_name_LOBSEG$”라는 이름의 비어있는 SecureFiles LOB을 생성한다. 이후, 첫번째 population이나 repopulation 동안 데이터베이스는 FastStart를 만든다.

이번 테스트에서는 IM FastStart 수행을 확인하기 위해, 먼저 IM FastStart 설정 population 속도롤 확인해 본다. 데이터베이스 재기동 , DBMS_INMEMORY.POPULATE 프로시저로 수동 population 수행했다. 11GB 사이즈 데이터가 3.8GB In-Memory Column Store population되는 아래 쿼리로 확인한 결과 5 11 정도의 시간이 소요되었다.

참고로 테이블 레벨의 Inmemory Compression 아래와 같이 확인한다.

SQL> select to_char(min(c.createtime),'hh24:mi:ss.ff2') start_pop,
          to_char(max(d.timestamp), 'hh24:mi:ss.ff2') finish_pop,
                                  max(d.timestamp)-min(c.createtime) as diff
from dba_objects a,
v$im_segments b,
v$im_segments_detail c,
v$im_header d
where a.owner = 'SH'
and object_type = 'TABLE'
and a.object_name = b.segment_name
and a.object_type = 'TABLE'
and a.object_id = c.baseobj
and c.dataobj = d.objd;
 
START_POP   FINISH_POP  DIFF
----------- ----------- ------------------------------
06:42:33.57 06:47:45.12 +000000000 00:05:11.544003

 

IM FastStart 영역에 칼럼 포맷 데이터를 생성을 위한 population 다시 필요했기 때문에 데이터베이스를 재기동 , IM FastStart 설정을 수행했다.

먼저 IM FastStart 사용 테이블스페이스를 생성한다. 테이블스페이스는  IM column store 위한 충분한 공간이 보되어야 하며 FastStart 지정 , 다른 데이터는 없어야 한다. 오라클의 권고 사항은 FastStart 테이블스페이스로 INMEMORY_SIZE 지정된 크기의 두배 사이즈로 생성할 것이 권고되지만, 여기서는 실제 In-Memory Column Store 사이즈를 고려해서 4GB 우선 생성했다.

테이블스페이스 생성 , dbms_inmemory_admin.faststart_enable 프로시저로 IM FastStart enable 시킨다. IM FastStart 영역 사용량은 v$inmemory_faststart_area 뷰를 통해 확인할 있다.

IM FastStart enable , 해당 테이블스페이스에 IM FastStart SecureFiles LOB 생성되어 있음을 있다.

SQL> create tablespace fs_tbs datafile '+DATA/DB0621_IAD3K9/C54478AE60122B1CE053031E000A0A07/DATAFILE/fs_tbs.dbf' size 4g reuse autoextend on next 500k;
Tablespace created.
 
SQL> exec dbms_inmemory_admin.faststart_enable('FS_TBS');
PL/SQL procedure successfully completed.
 
SQL> col tablespace_name format a20
SQL> select tablespace_name, status from   v$inmemory_faststart_area;
TABLESPACE_NAME      STATUS
-------------------- ----------
FS_TBS               ENABLE
 
SQL> col tablespace_name format a20
SQL> select tablespace_name, status,
       ( (allocated_size/1024) / 1024 ) as alloc_mb,
       ( (used_size/1024) / 1024 ) as used_mb
from   v$inmemory_faststart_area;
TABLESPACE_NAME      STATUS       ALLOC_MB    USED_MB
-------------------- ---------- ---------- ----------
FS_TBS               ENABLE           4096     1.3125
 
SQL> col segment_name format a20
SQL> select segment_name, logging from dba_lobs where  tablespace_name = 'FS_TBS';
SEGMENT_NAME         LOGGING
-------------------- -------
SYSDBIMFS_LOBSEG$    NO

 

수동 Population 수행했다.

SQL> execute dbms_inmemory.populate('SH','COUNTRIES');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','CUSTOMERS');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','PROMOTIONS');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','PRODUCTS');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','SUPPLEMENTARY_DEMOGRAPHICS');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','SALES');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','TIMES');
PL/SQL procedure successfully completed.

 

Population 완료 , v$inmemory_faststart_area 뷰를 확인해 보면 IM FastStart 사용량이 늘어나 있음을 있다.

SQL> select segment_name, bytes, inmemory_size, populate_status, bytes_not_populated from v$im_segments where owner='SH';
 
SEGMENT_NAME                        BYTES INMEMORY_SIZE POPULATE_STAT BYTES_NOT_POPULATED
------------------------------ ---------- ------------- ------------- -------------------
SALES                          7578124288    2874671104 COMPLETED                       0
PROMOTIONS                        1015808       1310720 COMPLETED                       0
CHANNELS                          1015808       1310720 COMPLETED                       0
SUPPLEMENTARY_DEMOGRAPHICS     1044717568     494075904 COMPLETED                       0
TIMES                              483328       1310720 COMPLETED                       0
CUSTOMERS                      2839076864     745275392 COMPLETED                       0
PRODUCTS                          1015808       1310720 COMPLETED                       0
COUNTRIES                         1015808       1310720 COMPLETED                       0
 
8 rows selected.
 
SQL> select tablespace_name, status,
       ( (allocated_size/1024) / 1024 ) as alloc_mb,
       ( (used_size/1024) / 1024 ) as used_mb
from   v$inmemory_faststart_area;
 
TABLESPACE_NAME      STATUS       ALLOC_MB    USED_MB
-------------------- ---------- ---------- ----------
FS_TBS               ENABLE           4096   3649.3125

 

이제, IM FastStart 사용으로 인한 population 상황을 확인해 것이다. 데이터베이스를 재기동하고 population 수행해 보면, 여전히 일부 테이블(여기서는 SALES)에서는 population 발생하고 있다. 나머지 테이블은 이미 population 완료되어 있다.

SQL> exit
Disconnected from Oracle Database 21c EE Extreme Perf Release 21.0.0.0.0 - Production
Version 21.1.0.0.0
[oracle@singledb scripts]$ sqlplus "/as sysdba"
...
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
...
Database opened.
 
SQL> alter session set container=DB0621_PDB1;
Session altered.
 
SQL> execute dbms_inmemory.populate('SH','COUNTRIES');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','CUSTOMERS');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','PROMOTIONS');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','PRODUCTS');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','SUPPLEMENTARY_DEMOGRAPHICS');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','SALES');
PL/SQL procedure successfully completed.
 
SQL> execute dbms_inmemory.populate('SH','TIMES');
PL/SQL procedure successfully completed.
 
SQL> select segment_name, bytes, inmemory_size, populate_status, bytes_not_populated from v$im_segments where owner='SH';
 
SEGMENT_NAME                        BYTES INMEMORY_SIZE POPULATE_STAT BYTES_NOT_POPULATED
------------------------------ ---------- ------------- ------------- -------------------
SALES                          7578124288     767229952 STARTED                5574451200
PROMOTIONS                        1015808       1310720 COMPLETED                       0
SUPPLEMENTARY_DEMOGRAPHICS     1044717568     500367360 COMPLETED                       0
TIMES                              483328       1310720 COMPLETED                       0
CUSTOMERS                      2839076864     744226816 COMPLETED                       0
PRODUCTS                          1015808       1310720 COMPLETED                       0
COUNTRIES                         1015808       1310720 COMPLETED                       0
 
7 rows selected.

 

기존 5 11 소요되었던 population 속도가 2 30초로 절반 이하로 떨어졌음을 있다.

SQL> select to_char(min(c.createtime),'hh24:mi:ss.ff2') start_pop,
          to_char(max(d.timestamp), 'hh24:mi:ss.ff2') finish_pop,
                                  max(d.timestamp)-min(c.createtime) as diff
from dba_objects a,
v$im_segments b,
v$im_segments_detail c,
v$im_header d
where a.owner = 'SH'
and object_type = 'TABLE'
and a.object_name = b.segment_name
and a.object_type = 'TABLE'
and a.object_id = c.baseobj
and c.dataobj = d.objd;
 
START_POP   FINISH_POP  DIFF
----------- ----------- ---------------------------------------------------------------------------
08:03:48.74 08:06:18.48 +000000000 00:02:29.741018

 

<END>