다량 데이타 입력을 처리하는 배치프로그램(성능향상)
다량 데이타 입력을 처리하는 배치프로그램에서 아래의 사항을 고려하면, 보다 효과적으로 속도를 개선시킬서수 있습니다.
OCI 환경 초기화
배치 처리를 위한 바인드 변수 설정
Oracle Call Interface(OCI)를 통해 다량의 데이터를 입력할 때, 성능을 최적화하려면 다음과 같은 전략을 사용할 수 있습니다.
OCI를 사용하여 데이터베이스 연결을 초기화합니다.
OCI에서는 다중 바인드 변수와 배열 인터페이스를 사용하여 대량 데이터를 효율적으로 처리할 수 있습니다.예: 한 번에 1000건의 데이터를 삽입하는 코드
OCIEnv *env; OCIError *err; OCISvcCtx *svc; OCIStmt *stmt; OCIEnvCreate(&env, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL); OCIHandleAlloc(env, (void **)&err, OCI_HTYPE_ERROR, 0, NULL); OCIHandleAlloc(env, (void **)&svc, OCI_HTYPE_SVCCTX, 0, NULL); // 데이터베이스 연결 OCIHandleAlloc(env, (void **)&svc, OCI_HTYPE_SVCCTX, 0, NULL); OCILogon(env, err, &svc, "username", strlen("username"), "password", strlen("password"), "dbname", strlen("dbname")); |
#define BATCH_SIZE 1000 #define MAX_COLUMN_LENGTH 100 char col1[BATCH_SIZE][MAX_COLUMN_LENGTH]; int col2[BATCH_SIZE]; OCIStmt *stmt; OCIHandleAlloc(env, (void **)&stmt, OCI_HTYPE_STMT, 0, NULL); // SQL 준비 char *sql = "INSERT INTO my_table (column1, column2) VALUES (:1, :2)"; OCIStmtPrepare(stmt, err, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); // 바인드 변수 설정 OCIBind *bnd1 = NULL, *bnd2 = NULL; OCIBindByPos(stmt, &bnd1, err, 1, (void *)col1, MAX_COLUMN_LENGTH, SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT); OCIBindByPos(stmt, &bnd2, err, 2, (void *)col2, sizeof(int), SQLT_INT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT); // 데이터 채우기 for (int i = 0; i < BATCH_SIZE; i++) { snprintf(col1[i], MAX_COLUMN_LENGTH, "Value_%d", i); col2[i] = i; } // 데이터 배치 삽입 OCIBindArrayOfStruct(bnd1, err, MAX_COLUMN_LENGTH, 0, 0, 0); OCIBindArrayOfStruct(bnd2, err, sizeof(int), 0, 0, 0); OCIStmtExecute(svc, stmt, err, BATCH_SIZE, 0, NULL, NULL, OCI_DEFAULT); |
부가적인 성능 최적화
- 네트워크 왕복 최소화:
- 한 번에 최대한 많은 데이터를 삽입하여 네트워크 왕복 횟수를 줄입니다.
- PL/SQL 프로시저 활용:
- PL/SQL 저장 프로시저를 작성하고, 데이터를 바인딩하여 호출하면 성능이 더욱 향상됩니다.
- 병렬 처리:
- Oracle Parallel DML을 활성화하거나 데이터를 병렬로 분할하여 삽입합니다.
- COMMIT 빈도 조정:
- 대량의 데이터를 삽입할 때 너무 자주 커밋하면 성능이 저하될 수 있으므로 적절한 빈도로 조정합니다.
'데이타베이스' 카테고리의 다른 글
T'way Holdings 의 <'> 특수문자 테이블에 입력하기 (0) | 2025.01.17 |
---|---|
프로시져.테이블내의 13개의 필드에 대한 1000줄의 입력데이타를 처리 (0) | 2025.01.17 |
프로시져.테이블내의 13개의 필드에 대한 1000줄의 입력데이타를 처리 (0) | 2025.01.17 |
프로시져로 전달한 데이타의 숫자,문자열구분 (0) | 2025.01.17 |
네트웍의 부하를 줄이기 위해서 오라클 프로시져 사용(입력1000번) (0) | 2025.01.17 |