본문 바로가기
업무 기록/ETC

SQL 대량 테스트 [Oracle PL/SQL]

by code2772 2024. 1. 25.

[ 목차 ]

    728x90
    반응형

    [ 서론 ]

    이전 다양한sql 을 사용하여 대량 테스트를 해야하는 경우가 있어 정리를 하게 되었다. mysql, oracle, mssql, postgres 등 테스트 해보았고 여기서는 ORACLE 을 정리하였다.

    Oracle PL/SQL을 사용하여 작성된 프로시저이다. 이 코드는 메시지 큐 테이블에 대량의 데이터를 삽입하는 작업을 수행하는데 사용된다. 

    PL/SQL은 Oracle 데이터베이스에서 사용되는 절차적 프로그래밍 언어로, SQL 문을 확장하여 프로시저, 트리거, 함수 등을 지원한다.

    [ 코드 ]

    DECLARE
      var_i NUMBER := 1;
      var_j NUMBER := 1;
      var_phone VARCHAR2(20);
      arg_count NUMBER :=100000;  -- 반복 횟수를 지정한다!!!
      rtn_inscnt  NUMBER;
      arg_type VARCHAR2(20) := 'S'; -- 선택 유형을 선택!!!
    
    BEGIN
      -- Oracle에서는 트랜잭션을 명시적으로 시작할 필요가 없습니다.
    
      WHILE var_i <= arg_count LOOP
        var_phone := TO_CHAR(var_j);
        var_phone := LPAD(var_phone, 4, '0'); -- 전화번호 4자리 만들기!!!
        var_phone := '0106379' || var_phone; -- 전화번호 연결하기 !!!
        
        IF (arg_type = 'S') THEN
          INSERT INTO msg_queue_v20hs(mseq, msg_type, dstaddr, callback, request_time, text)
          VALUES (msg_queue_v20hs_seq.nextval, arg_type, var_phone, '----------', sysdate, 'SMS 테스트입니다. 감사합니다.');
        ELSIF (arg_type = 'L') THEN
          INSERT INTO msg_queue_v20hs(mseq, msg_type, dstaddr, callback, request_time, subject, text)
          VALUES (msg_queue_v20hs_seq.nextval, 'M', var_phone, '-------', sysdate, 'LMS 제목 입니다.',
                  'LMS 내용입니다.');
        ELSIF (arg_type = 'M') THEN
          INSERT INTO msg_queue_v20hs(mseq, msg_type, dstaddr, callback, request_time, subject, text, filecnt, fileloc1)
          VALUES (msg_queue_v20hs_seq.nextval, arg_type, var_phone, '--------', sysdate, 'MMS 제목 입니다.',
                  'MMS 내용입니다.',
                  1, '/home/hssong/hssong2000/mmsfile/galaxy.jpg');
        ELSE
          INSERT INTO msg_queue_v20hs(mseq, MSG_TYPE, DSTADDR, CALLBACK, SUBJECT, TEXT, REQUEST_TIME, JSON_DATA1, JSON_DATA2)
          VALUES (msg_queue_v20hs_seq.nextval, arg_type, var_phone, '----------', '제목입니다. 감사합니다.', '대체발송 내용입니다. 감사합니다.', sysdate,
    
             					    .........[JSON 내용 생략] .....
    
                        }]
                      }]
                    }
                  }');
        END IF;
    
        IF MOD(var_i , 5000) = 0 THEN
          COMMIT;
        END IF;
    
        var_i := var_i + 1;
        var_j := var_j + 1;
      END LOOP;
    
      COMMIT;
    
      rtn_inscnt := var_i - 1;
    
    END;
    /

     

    [ 설명 ]

     arg_count NUMBER :=100000;  -- 반복 횟수를 지정한다!!!

    : 내가 얼마나 많은 데이터를 실핼할지 반복 횟수를 설정하는 부분이다. 원하는 만큼 수를 변경 할 수 있다.

      arg_type VARCHAR2(20) := 'S'; -- 선택 유형을 선택!!!

    : IF ELSE 문을 사용하여 원하는 쿼리를 변경하기 위해 만든 부분이다. 

    WHILE var_i <= arg_count LOOP

    : var_i가 arg_count보다 작거나 같을 때까지 반복하는 부분이다.

     

     

    [ 대량 테스트 후 초당 속도 확인하기 ]

    https://hunseop2772.tistory.com/325

     

    리눅스 1초마다 실행 된 반복된 횟수 찾기(더하기)

    메세지 발송 코드 디버깅 과정에서 새로 배운 내용이다. 기존 테스트 시에는 Postman 이나 Jmeter에 이미 초당 발송 건수나 평균을 확인할 수 있는 경우가 많았는데 SQL 로 10000건같이 대량 발송 후 초

    hunseop2772.tistory.com

     

    반응형