티스토리 뷰

반응형

CockroachDB에 대용량 데이터를 입력할 때 성능 향상법을 소개해 드립니다.

 

Java로 프로그래밍 할 경우에 JDBC가 RDBMS에 연동하는 표준 방법이죠.

 

다량의 데이터를 빠르게 처리하는 방법이 바로 JDBC의 Batch를 이용하는 것입니다.

 

PostgreSQL용 jdbc로 CockroachDB에 데이터를 넣고 있었는데 속도가 만족스럽지 않아서

 

CockroachDB Document에 소개되어 있는 Multiple Insert 방법으로 변경했더니,

 

변경전보다 약 5~10배 정도 입력 속도가 향상이 되었습니다.

 

입력속도가 일정하지 않은 것은 CockroachDB가 Store Engine으로 사용하고 있는 "RockDB" 특성

 

때문입니다. RockDB는 페이스북에서 구글의 " LevelDB"를 가져다가 만든 것입니다.

 

LevelDB는 "Log Structured Merge" 알고리즘으로 데이터를 저장하는 데,  초기에 Level0 으로 파일이 만들어 지다가

 

일정한 갯수가 초과되면 인접한 파일들이 합병(Merge)됩니다. Merge가 된 파일들은 Level이 증가되는 구조입니다.

 

현재 제가 진행하고 있는 프로젝트에서는 Level6까지 파일이 만들어져 있습니다.

 

RockDB엔진을 사용할 때 최상의 성능을 발휘 할 수 있도록 다양한 옵션을 제공하는 데, CockroachDB는 아무리 찾아봐도

 

저장 엔진인 RockDB를 제어할 수 있는 옵션이 많이 없습니다.

 

아마도 개발시 다양한 환경에서 얻어지 기준값으로 최적화 했으니, 이대로 사용하라는 것으로 보입니다.

 

JDBC Batch는 PreparedStatement를 사용했으며, Multiple Insert는 Statement 를 사용했습니다.

 

둘다 1000건씩 입력되도록 코딩했습니다.

 

Multiple Insert는 아래와 같이 "DML"를 만드는 것입니다.

INSERT INTO T_ORDER

(ORDER_NO, PRDT_CD, PRDT_PRICE)

VALUES

(1, '0001', 1000),

(1, '0001', 1000),

(1, '0001', 1000),

(1, '0001', 1000);

 

Oracle로 테스트 했을 경우에 PreparedStatement로 입력값은 모두 바인드 변수 처리하고, Batch로 묶어서

 

데이터를 입력했을 때 성능이 제일 좋았는 데, CockroachDB는 전통적인 DBMS와 달라서 Multiple Insert 방법이

 

더 효과적으로 보입니다.

 

데이터 마이그레이션 속도가 너무 나오지 않아서 고민하고 있었는 데, "Multiple Insert" 방법이 속도 문제를 어느 정도

 

해소해 주어서 프로젝트를 계속 진행할 수 있었습니다.

 

 

 

반응형