본문 바로가기
SQL

오라클 쿼리 부하 테스트

by 긴소리 2025. 3. 6.
728x90
반응형

내가 보려고 작성해 두는 글
몇건부터 부하가 발생하는지 체크하기 위해 테스트 진행


☑️부하 테스트를 위한 샘플 데이터 생성
먼저, 성능 테스트를 위해 대량의 데이터를 생성
테스트할 테이블을 만들고, 원하는 데이터량을 INSERT해 봅시다.

CREATE TABLE TEST_LOAD (
    ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(50),
    CREATED_DATE DATE
);


☑️샘플 데이터 삽입

INSERT INTO TEST_LOAD (ID, NAME, CREATED_DATE)
SELECT LEVEL, 
       'USER_' || LEVEL, 
       SYSDATE - DBMS_RANDOM.VALUE(0, 365)
FROM DUAL
CONNECT BY LEVEL <= 1000000;

COMMIT;

100만 건을 생성하여 실제 부하를 테스트할 준비를 합니다.
SYSDATE - DBMS_RANDOM.VALUE(0, 365)를 사용해 랜덤한 날짜를 추가합니다.

☑️2. 실행 시간 측정 방법
오라클에서는 DBMS_UTILITY.GET_TIME 또는 SYSTIMESTAMP를 활용해서 실행 시간을 측정할 수 있어요.

🔹 실행 시간 측정 (SYSTIMESTAMP 활용)

DECLARE
    v_start TIMESTAMP;
    v_end TIMESTAMP;
BEGIN
    v_start := SYSTIMESTAMP;

    -- 💡 실행할 쿼리
    SELECT COUNT(*) FROM TEST_LOAD WHERE ID < 500000;

    v_end := SYSTIMESTAMP;

    DBMS_OUTPUT.PUT_LINE('Execution Time: ' || (v_end - v_start));
END;
/

SYSTIMESTAMP 차이를 계산하여 실행 시간을 확인
ID가 특정 범위(ID < 500000)일 때 성능을 측정하여 몇 건부터 오래 걸리는지 분석 가능

🔹 실행 시간 측정 (DBMS_UTILITY.GET_TIME 활용)

DECLARE
    v_start NUMBER;
    v_end NUMBER;
BEGIN
    v_start := DBMS_UTILITY.GET_TIME;

    -- 💡 실행할 쿼리
    SELECT COUNT(*) FROM TEST_LOAD WHERE CREATED_DATE BETWEEN SYSDATE - 30 AND SYSDATE;

    v_end := DBMS_UTILITY.GET_TIME;

    DBMS_OUTPUT.PUT_LINE('Execution Time: ' || (v_end - v_start) || ' hundredths of a second');
END;
/


✅ 3. 실행 계획(EXPLAIN PLAN) 분석

쿼리가 느려지는 원인을 파악하려면 실행 계획을 확인하는 것이 중요합니다.

🔹 EXPLAIN PLAN 실행

EXPLAIN PLAN FOR
SELECT COUNT(*) FROM TEST_LOAD WHERE CREATED_DATE BETWEEN SYSDATE - 30 AND SYSDATE;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

실행 계획을 확인하여 Full Table Scan(FULL) 또는 Index 사용 여부 확인

🔍 실행 계획 해석하기
TABLE ACCESS FULL → 테이블 전체 스캔(성능 저하 가능성 높음)
INDEX RANGE SCAN → 인덱스가 적절히 사용됨 (빠름)
HASH JOIN, SORT → 메모리 부하 가능성 확인 필요

✅ 4. 점진적으로 부하를 증가시키며 테스트

어느 시점부터 성능이 저하되는지 확인하려면 반복적으로 실행하는 테스트를 진행하면 좋아요.

🔹 점진적 부하 테스트

DECLARE
    v_count NUMBER := 100000;
    v_step NUMBER := 100000;
    v_max NUMBER := 1000000;
    v_start TIMESTAMP;
    v_end TIMESTAMP;
BEGIN
    FOR i IN 1..(v_max / v_step) LOOP
        v_start := SYSTIMESTAMP;

        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM TEST_LOAD WHERE ID <= ' || v_count;

        v_end := SYSTIMESTAMP;

        DBMS_OUTPUT.PUT_LINE('Rows: ' || v_count || ' | Execution Time: ' || (v_end - v_start));

        v_count := v_count + v_step;
    END LOOP;
END;
/


처음 10만 개부터 시작해서 10만 개씩 증가하면서 실행 시간 측정
어느 시점부터 실행 시간이 급격히 증가하는지 확인 가능


정리

✔ 샘플 데이터 100만 건 생성 후 테스트 진행
✔ SYSTIMESTAMP, DBMS_UTILITY.GET_TIME으로 실행 시간 측정
✔ EXPLAIN PLAN을 활용해 쿼리 실행 계획 분석
✔ 점진적 부하 테스트(ID 범위 증가하면서 실행 시간 측정)
✔ 인덱스 추가, 병렬 실행, 파티셔닝을 통한 성능 최적화 가능


반응형

댓글