본문 바로가기

Database/Oracle Database

19c 신기능 - Memoptimized Rowstore - Fast Ingest

아래 오라클 문서를 참조한 내용입니다.

Enabling High Performance Data Streaming with the Memoptimized Rowstore
New in Oracle Database 19c: Memoptimized Rowstore – Fast Ingest

 

Concept

Memoptimized Rowstore는 IoT 어플리케이션 처럼 많은 수의 클라이언트에서 동시에 단일 로우 insert를 하거나, 빈번한 조회가 발생하는 어플리케이션에 대해 고성능 데이터 스트리밍을 할 수 있게 해 주는 오라클 데이터베이스 19c 신기능입니다. ①빠른 Insert를 가능케하는 Fast Ingest와 ②빠른 조회를 위한 Fast Lookup 두가지 기능이 있는데요, 여기에서는 Fast Ingest에 대해 살펴보겠습니다.

Memoptimized Rowstore를 사용하기 위해서는 오라클 데이터베이스 19.12 버전이 필요합니다. 그 이전 버전의 19c인 경우는 Exadata나 ExaCS/CC에서만 사용 가능합니다. On-premise 리눅스 환경에서 19c를 설치한 경우, 19.12 패치가 필요합니다.

 

 

Memoptimized Rowstore - Fast Ingest의 목적은 ACID 요건의 완전히 만족하지 않아도 되는, 그러나 데이터셋으로서의 가치가 큰 대량의 데이터를 빠르게 생성하는데 있습니다.

insert 된 데이터는 개별 로우별로 처리가 되는 것이 아니라 메모리(large pool)에 캐싱된 후, 비동기 방식으로 디스크에 flush됩니다. 따라서 기존 오라클 데이터베이스의 redo log를 이용한 트랜잭션 처리와는 다르게, 캐싱된 데이터가 데이터베이스 파일에 씌여지기 전에 데이터베이스가 종료되면 데이터 손실이 발생할 수 있습니다. 모든 데이터가 데이터베이스에 씌여졌는지에 대한 체크는 어플리케이션 레벨에서 이루어지며, 이를 위해 "Write verification API"라고 하는 별도 API가 추가 되었습니다.

 

Sample Usage

현재 large pool에 32MB가 할당되어 있습니다.

SQL> select * from v$sgainfo;

NAME                                  BYTES RES     CON_ID
-------------------------------- ---------- --- ----------
Fixed SGA Size                      9695720 No           0
Redo Buffers                        7077888 No           0
Buffer Cache Size                3942645760 Yes          0
In-Memory Area Size                       0 No           0
Shared Pool Size                  872415232 Yes          0
Large Pool Size                    33554432 Yes          0
Java Pool Size                            0 Yes          0
Streams Pool Size                         0 Yes          0
Shared IO Pool Size               134217728 Yes          0
Data Transfer Cache Size                  0 Yes          0
Granule Size                       16777216 No           0

NAME                                  BYTES RES     CON_ID
-------------------------------- ---------- --- ----------
Maximum SGA Size                 4865389032 No           0
Startup overhead in Shared Pool   230331392 No           0
Free SGA Memory Available                 0              0

14 rows selected.

 

먼저 기존 방식(Memoptimized Rowstore - Fast Ingest 방식과 대비되는 의미)의 테스트용 테이블과 프로시저를 생성합니다. 프로시저는 100만건 데이터를 insert하고, 건마다 commit을 하고, 전체 응답시간을 체크합니다.

SQL> create table demo.demotab
(col1 number,
 col2 varchar2 (100),
 col3 varchar2 (100),
 col4 varchar2 (100),
 col5 varchar2 (100),
 constraint  demotab_pk primary key (col1)
)
tablespace demo;

Table created.

SQL> CREATE OR REPLACE PROCEDURE demo.demoproc
IS
   var_sysdate DATE;
   var_elapsed_time NUMBER :=0;
BEGIN
   var_sysdate := SYSDATE;
   FOR I IN 1..1000000
   LOOP
      insert into demo.demotab values (I, 'this is the test for the 19c new feature of memoptimized rowstore','this is the test for the 19c new feature of memoptimized rowstore','this is the test for the 19c new feature of memoptimized rowstore','this is the test for the 19c new feature of memoptimized rowstore');
      commit;
   END LOOP;
   var_elapsed_time := (SYSDATE - var_sysdate) * 60 * 60 * 24;
   DBMS_OUTPUT.PUT_LINE('########################################################');
   DBMS_OUTPUT.PUT_LINE('Elapsed Time : ' || round(var_elapsed_time,0) );
   DBMS_OUTPUT.PUT_LINE('########################################################');
END;
/

Procedure created.

 

프로시저를 수행합니다. 여기서는 100만건 insert하는데 50초가 소요되었습니다.

SQL> set serveroutput on;
SQL> exec demo.demoproc;
########################################################
Elapsed Time : 50
########################################################

PL/SQL procedure successfully completed.

 

이번에는 Memoptimized Rowstore - Fast Ingest 테이블을 생성하고, 해당 테이블에 100만건 데이터를 insert, commit하는 프로시저를 생성합니다. 단 테이블 생성 시 segment creation immediate, memoptimize for write 옵션이, insert 구문에는 /*+ memoptimize_write */ 힌트가 필요합니다.

SQL> create table demo.demotab_memopt
(col1 number,
 col2 varchar2 (100),
 col3 varchar2 (100),
 col4 varchar2 (100),
 col5 varchar2 (100),
 constraint  demotab_memopt_pk primary key (col1)
)
segment creation immediate
memoptimize for write
tablespace demo;

Table created.

SQL> CREATE OR REPLACE PROCEDURE demo.demoproc_memopt
IS
   var_sysdate DATE;
   var_elapsed_time NUMBER :=0;
BEGIN
   var_sysdate := SYSDATE;
   FOR I IN 1..1000000
   LOOP
      insert /*+ memoptimize_write */ into demo.demotab_memopt values (I, 'this is the test for the 19c new feature of memoptimized rowstore','this is the test for the 19c new feature of memoptimized rowstore','this is the test for the 19c new feature of memoptimized rowstore','this is the test for the 19c new feature of memoptimized rowstore');
      commit;
   END LOOP;
   var_elapsed_time := (SYSDATE - var_sysdate) * 60 * 60 * 24;
   DBMS_OUTPUT.PUT_LINE('########################################################');
   DBMS_OUTPUT.PUT_LINE('Elapsed Time : ' || round(var_elapsed_time,0) );
   DBMS_OUTPUT.PUT_LINE('########################################################');
END;
/

Procedure created.

 

Memoptimized Rowstore - Fast Ingest를 사용했을 때는 100만건 insert하는데 15초가 소요되었습니다.

SQL> set serveroutput on;
SQL> exec demo.demoproc_memopt;
########################################################
Elapsed Time : 15
########################################################

PL/SQL procedure successfully completed.

 

large pool이 약 2GB로 늘어나 있음을 볼 수 있습니다.

SQL> select count(*) from demo.demotab;

  COUNT(*)
----------
   1000000

SQL> select count(*) from demo.demotab_memopt;

  COUNT(*)
----------
   1000000

SQL> select * from v$sgainfo;

NAME                                  BYTES RES     CON_ID
-------------------------------- ---------- --- ----------
Fixed SGA Size                      9695720 No           0
Redo Buffers                        7077888 No           0
Buffer Cache Size                1677721600 Yes          0
In-Memory Area Size                       0 No           0
Shared Pool Size                  872415232 Yes          0
Large Pool Size                  2298478592 Yes          0
Java Pool Size                            0 Yes          0
Streams Pool Size                         0 Yes          0
Shared IO Pool Size               134217728 Yes          0
Data Transfer Cache Size                  0 Yes          0
Granule Size                       16777216 No           0

NAME                                  BYTES RES     CON_ID
-------------------------------- ---------- --- ----------
Maximum SGA Size                 4865389032 No           0
Startup overhead in Shared Pool   230331392 No           0
Free SGA Memory Available                 0              0

14 rows selected.