내가 보려고 작성해 두는 글
몇건부터 부하가 발생하는지 체크하기 위해 테스트 진행
☑️부하 테스트를 위한 샘플 데이터 생성
먼저, 성능 테스트를 위해 대량의 데이터를 생성
테스트할 테이블을 만들고, 원하는 데이터량을 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 범위 증가하면서 실행 시간 측정)
✔ 인덱스 추가, 병렬 실행, 파티셔닝을 통한 성능 최적화 가능
'SQL' 카테고리의 다른 글
오라클(Oracle DB) 개발 시 반드시 알아야 할 내용(MySQL, MSSQL와 차이점) (0) | 2025.03.06 |
---|---|
오라클 DUAL 테이블로 원하는 개수만큼 행 생성하기 (0) | 2025.03.06 |
[PostgreSQL] current transaction is aborted, commands ignored until end of transaction block (0) | 2023.11.01 |
[POSTGRESQL] null to 0 으로 치환하기 (0) | 2023.02.16 |
[SQL] POSTGRES SQL ->>, ->가 뭔가요? (0) | 2022.12.21 |
댓글