Home 더미데이터 생성 스크립트
Post
Cancel

더미데이터 생성 스크립트

프로젝트 개발 단계에서는 DB에 데이터가 별로 많지 않아서 쿼리를 거지같이 짜놔도 1초 안에 결과가 나오기 때문에 쿼리가 잘 작성되어 있는지 판단하기 어렵다.
그래서 개발 단계에서 DB에 충분한 더미데이터를 생성하여 쿼리의 성능을 쉽게 파악하는 것을 목표로 더미데이터 생성 스크립트를 준비해보기로 했다.

테이블 하나당 프로시저 하나 씩 만들면 너무 번거로워 질 것으로 예상하여 insert sql 을 매개변수로 받아서 dynamic 하게 테이블을 변경할 수 있도록 작성했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
create or replace PROCEDURE GENERATE_DUMMY_DATA(input IN STRING, p_count IN NUMBER) AS

    insert_sql VARCHAR2(4000);

BEGIN

    DBMS_OUTPUT.put_line('=========');
    DBMS_OUTPUT.put_line(input);

    -- 작은따옴표로 감싸진 random 함수들을 찾아서 작은따옴표를 제거
    insert_sql := REGEXP_REPLACE(
        input, 
        '''(random_string\(\d+\))''',
        '\1'
    );
    
    insert_sql := REGEXP_REPLACE(
        insert_sql, 
        '''(random_number\(\d+\))''',
        '\1'
    );
    
    insert_sql := REGEXP_REPLACE(
        insert_sql, 
        '''(random_date)''',
        '\1'
    );

    -- random 함수들을 실제 Oracle 함수로 치환
    insert_sql := REGEXP_REPLACE( -- random_string(n) → DBMS_RANDOM.STRING('X', n)
        insert_sql, 
        'random_string\((\d+)\)',
        'DBMS_RANDOM.STRING(''X'', \1)'
    );

    insert_sql := REGEXP_REPLACE(
        insert_sql, 
        'random_number\((\d+)\)',
        'TRUNC(DBMS_RANDOM.VALUE(-1 * POWER(10,\1), POWER(10,\1) -1))'
    );
    
    insert_sql := REGEXP_REPLACE(
        insert_sql, 
        'random_date',
        'TO_DATE( TRUNC( DBMS_RANDOM.VALUE(TO_CHAR(DATE ''2000-01-01'',''J''),TO_CHAR(DATE ''2099-12-31'',''J'') ) ),''J'' )'
    );

    DBMS_OUTPUT.put_line(insert_sql);
    DBMS_OUTPUT.put_line('=========');

FOR i IN 1..p_count LOOP
        EXECUTE IMMEDIATE insert_sql;

        IF MOD(i, 10000) = 0 THEN -- 1만개 단위로 commit
            COMMIT;
END IF;

END LOOP;

COMMIT;
END GENERATE_DUMMY_DATA;

위와 같은 모양으로 프로시저를 선언하고

1
2
3
4
5
BEGIN 
    GENERATE_DUMMY_DATA(
        'insert into users (user_key, ci, di, user_id, name, birthday, addr, sex) values (seq.nextval, random_string(88), random_string(64), random_string(50), random_string(50), random_number(8), random_string(200), ''M'')',
        10);
END;

이렇게 호출하면 원하는 건수만큼 더미데이터를 생성할 수 있다.
프로시저 첫 번째 인자(insert문) 끝에 ;를 넣으면 ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다 오류가 발생할 수 있다.

1
2
SET TIMING ON
SET SERVEROUTPUT ON

대량의 데이터를 넣으며 시간을 측정하고 싶다면 sqldeveloper에서 프로시저를 호출하기 전에 위의 설정을 켜면 된다.

This post is licensed under CC BY 4.0 by the author.

Lb To Httpd 서버가 연결이 안될 때

React Springboot로 운영서버 구축과 Ssl인증서 적용