다량 데이타 입력을 처리하는 배치프로그램(성능향상)

다량 데이타 입력을 처리하는 배치프로그램에서 아래의 사항을 고려하면, 보다 효과적으로 속도를 개선시킬서수 있습니다.


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);


부가적인 성능 최적화

  1. 네트워크 왕복 최소화:
    • 한 번에 최대한 많은 데이터를 삽입하여 네트워크 왕복 횟수를 줄입니다.
  2. PL/SQL 프로시저 활용:
    • PL/SQL 저장 프로시저를 작성하고, 데이터를 바인딩하여 호출하면 성능이 더욱 향상됩니다.
  3. 병렬 처리:
    • Oracle Parallel DML을 활성화하거나 데이터를 병렬로 분할하여 삽입합니다.
  4. COMMIT 빈도 조정:
    • 대량의 데이터를 삽입할 때 너무 자주 커밋하면 성능이 저하될 수 있으므로 적절한 빈도로 조정합니다.

+ Recent posts