"처음 사용자를 위한 Oracle Database In-Memory 가이드" 시리즈를 통해 Swingbench의 분석 업무 스키마 ‘SH’ 데이터를 이용해서 오라클 21c Single 인스턴스 데이터베이스와 RAC 데이터베이스에서 간단한 In-memory 옵션 사용 방법을 살펴봅니다.
글 순서
#4. In-Memory 테스트 – Single 인스턴스 DB: In-Memory 설정 & Population
#5. In-Memory 테스트 – Single 인스턴스 DB: In-Memory 수행 확인
#6. 참고. 칼럼 레벨 In-Memory 설정 및 In-Memory hybrid scan
#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>