간만의 포스팅이 일이야기라니..
내 삶이 삭막하기 그지없구나.. -_-;;;
어쩌둥둥.. 시작한 포스팅.. 마무리를 지어야지..
이번에 대용량 데이터를 처리해야 하는 일이 생겨 처음으로 사용해 본
Array를 이용한 DB 다중 Insert !!
뭐 아는 사람들은 이미 알수도 있지만.. 나의 DB지식의 밑천은 학부때 들은 DB수업이 달랑인지라... 아직도 DB의 세계는 심오하기만 한다.. -_-;;
(인덱스며.. 프로시져.. 트리거.. 속도개선을 위한 튜닝작업 한번 하자면...아웅~~ @_@)
아래의 방법처럼 배열을 이용하여 DB Insert 작업을 하면 데이터를 읽어서 하나하나 Insert 때리고 있는거 보다 시간이 초절약된다.
fscanf로 파일 내용을 읽어서 배열에 잘 저장한 다음 Insert를 한번만 해주면 쑤욱 입력되어 버리는..간단한 프로그램이지만.. 그 효과는 실로 놀랍다.
200만건 이상의 자료를 하나씩 Insert 하였을 때 1시간 반이 걸리던 작업이 배열을 사용하여 1000건씩 끊어 Insert 할 경우 2~3분이면 끝이 난다.. 브라보~
아.. 암만해도.. 올해는 대용량 데이터베이스처리와 관련한 공부를 좀 하긴 해야할 듯.. -_-;;;
/* 배열을 이용한 삽입 예제 */
#include
/***************************************************************
This is is a sample Pro*C program which uses the FOR option
by inserting records into the EMP table.
***************************************************************/
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR uid[20];
VARCHAR pwd[20];
int empno[100];
VARCHAR ename[100][15];
VARCHAR job[100][10];
VARCHAR hiredate[100][9];
float sal[100];
int deptno[100];
int loop;
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA;
FILE *fp;
void main(void)
{
int i;
int fsret;
/* log into ORACLE */
strcpy(uid.arr, "SCOTT"); /* copy the user name */
uid.len = strlen(uid.arr);
strcpy(pwd.arr, "TIGER"); /* copy the password */
pwd.len = strlen(pwd.arr);
EXEC SQL WHENEVER SQLERROR GOTO errrpt;
EXEC SQL CONNECT :uid IDENTIFIED BY :pwd;
printf("Connected to ORACLE user : %s\n\n\n", uid.arr);
if((fp = fopen("test.dat", "r")) == NULL)
{
printf("Error opening file test.dat \n");
exit(1);
}
while(1)
{
for(i = 0; i < 100 ; i++)
{
fsret = fscanf(fp, "%d %s %s %s %f %d",
&empno[i], ename[i].arr, job[i].arr, hiredate[i].arr,
&sal[i], &deptno[i]);
if(fsret == EOF)
break;
if(fsret == 0)
{
printf("Incompatible field on the line. \n");
exit(1);
}
ename[i].len = strlen(ename[i].arr);
job[i].len = strlen(job[i].arr);
hiredate[i].len = strlen(hiredate[i].arr);
}
loop = i;
EXEC SQL FOR :loop
INSERT INTO EMP(empno, ename, job, hiredate, sal, deptno)
VALUES(:empno, :ename, :job, :hiredate, :sal, :deptno);
EXEC SQL COMMIT WORK;
printf("%d rows inserted. \n", sqlca.sqlerrd[2]);
if(loop < 100)
break;
}
printf("File test.dat loaded. \n");
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL COMMIT work RELEASE;
exit(0);
errrpt:
printf("\n %70s \n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
}
|