아래 오라클 문서를 참조한 내용입니다.
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.
끝
'Database > Oracle Database' 카테고리의 다른 글
commit_wait, commit_logging 설정이 성능에 미치는 영향 (0) | 2021.08.31 |
---|---|
Oracle Database In-Memory Advisor (0) | 2021.08.31 |
18c 신기능 - 오라클 샤딩 (Sharding) - #1 개념 (0) | 2021.08.09 |
21c 신기능 - 블록체인 테이블 (0) | 2021.08.04 |
오라클 데이터베이스 샘플 스키마 설치 (0) | 2021.08.04 |