반응형

오라클 배치(Batch)는 대량의 데이터를 효율적으로 처리하거나 주기적인 작업을 자동으로 수행하기 위해 사용됩니다. 배치는 반복 작업의 성능을 최적화하고, 트랜잭션을 일괄적으로 처리하여 성능 및 리소스 관리를 개선하는 데 유용합니다. 이번 글에서는 오라클 배치 처리의 개념, 작성법, 다양한 예제와 함께 사용 시 유의점을 상세히 설명하겠습니다.


1. 오라클 배치 처리란?

배치 처리란 대량의 작업을 한 번에 묶어서 처리하는 방식으로, 데이터 삽입, 갱신, 삭제 등의 작업을 효율적으로 실행하는 방법입니다. 주로 데이터 웨어하우스, 대용량 데이터 처리, 데이터 마이그레이션, 백업 및 복구 작업에 사용됩니다.

1.1 배치 처리가 필요한 이유

  • 대량 데이터 처리: 하나씩 처리하는 대신, 작업을 묶어서 실행함으로써 성능을 향상.
  • 성능 최적화: 네트워크 및 디스크 I/O를 줄이고, 트랜잭션 관리를 단순화.
  • 자동화 작업: 야간 배치 처리, 주기적 데이터 업데이트 등의 작업에 적합.

1.2 배치 처리의 주요 특징

  • 일괄 실행: 대량 데이터를 한 번에 처리하여 네트워크 및 데이터베이스 작업을 줄임.
  • 자동화: 사전에 설정된 작업을 스케줄러로 주기적으로 실행 가능.
  • 트랜잭션 제어: 일괄 작업 전체를 하나의 트랜잭션으로 관리하거나, 일부 성공 시 커밋 가능.

2. 오라클 배치 처리의 구성 요소

오라클에서 배치 처리를 구현하려면 다음 요소를 활용합니다.

2.1 SQL*Plus 스크립트

SQL*Plus는 오라클의 기본 CLI 도구로, 스크립트를 실행하여 배치 작업을 처리합니다.

2.2 PL/SQL 블록

PL/SQL은 절차형 언어로 대량 데이터를 처리할 수 있는 루프 및 조건문을 제공합니다.

2.3 Oracle Scheduler

Oracle Scheduler를 사용하면 작업 스케줄링 및 관리가 가능합니다. 이는 DBMS_SCHEDULER 패키지를 통해 구현됩니다.

2.4 JDBC 배치 처리

Java 애플리케이션에서 JDBC를 활용하여 배치를 실행할 수 있습니다.


3. 배치 처리 작성법과 유형별 예제

3.1 SQL*Plus 스크립트를 활용한 배치 처리

예제: 테이블 데이터 백업

SET ECHO ON
SET FEEDBACK ON
SET SERVEROUTPUT ON

-- 기존 테이블 데이터 백업
BEGIN
    EXECUTE IMMEDIATE 'CREATE TABLE employees_backup AS SELECT * FROM employees';
END;
/

설명

  • SQL*Plus 스크립트를 작성하여 주기적으로 실행합니다.
  • 스크립트를 운영체제 스케줄러(cron, Task Scheduler)와 결합하여 자동화할 수 있습니다.

3.2 PL/SQL 블록을 활용한 배치 처리

예제: 대량 데이터 삽입

DECLARE
    v_counter NUMBER := 0;
BEGIN
    FOR i IN 1..10000 LOOP
        INSERT INTO employees (employee_id, first_name, last_name, salary)
        VALUES (i, 'First' || i, 'Last' || i, 5000 + i);

        v_counter := v_counter + 1;

        -- 1000건마다 커밋
        IF MOD(v_counter, 1000) = 0 THEN
            COMMIT;
        END IF;
    END LOOP;
    COMMIT; -- 최종 커밋
END;
/

설명

  • 루프를 사용해 데이터를 반복적으로 삽입합니다.
  • MOD를 활용하여 특정 횟수마다 커밋을 실행하여 메모리 부담을 줄입니다.

3.3 Oracle Scheduler를 활용한 배치 작업

예제: 주기적인 테이블 데이터 아카이빙

BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
        job_name        => 'archive_old_data',
        job_type        => 'PLSQL_BLOCK',
        job_action      => 'BEGIN DELETE FROM employees WHERE hire_date < ADD_MONTHS(SYSDATE, -12); COMMIT; END;',
        start_date      => SYSTIMESTAMP,
        repeat_interval => 'FREQ=DAILY; BYHOUR=1; BYMINUTE=0; BYSECOND=0',
        enabled         => TRUE
    );
END;
/

설명

  • Oracle Scheduler를 사용해 매일 새벽 1시에 오래된 데이터를 삭제.
  • DBMS_SCHEDULER.CREATE_JOB으로 작업 스케줄을 설정.

3.4 JDBC를 활용한 배치 처리 (Java)

예제: 대량 데이터 삽입

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class OracleBatchExample {
    public static void main(String[] args) {
        String url = "jdbc:oracle:thin:@localhost:1521:xe";
        String user = "hr";
        String password = "password";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            conn.setAutoCommit(false);

            String sql = "INSERT INTO employees (employee_id, first_name, last_name, salary) VALUES (?, ?, ?, ?)";
            try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
                for (int i = 1; i <= 10000; i++) {
                    pstmt.setInt(1, i);
                    pstmt.setString(2, "First" + i);
                    pstmt.setString(3, "Last" + i);
                    pstmt.setDouble(4, 5000 + i);

                    pstmt.addBatch();

                    if (i % 1000 == 0) {
                        pstmt.executeBatch();
                        conn.commit();
                    }
                }
                pstmt.executeBatch(); // 남은 배치 실행
                conn.commit();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

설명

  • JDBC의 addBatchexecuteBatch를 사용해 일괄 삽입 처리.
  • 1,000건마다 commit을 실행하여 메모리 사용량을 최적화.

3.5 대량 데이터 처리 최적화: BULK COLLECT와 FORALL

예제: BULK COLLECT와 FORALL 사용

DECLARE
    TYPE emp_tab IS TABLE OF employees%ROWTYPE;
    v_employees emp_tab;
BEGIN
    SELECT * BULK COLLECT INTO v_employees
    FROM employees
    WHERE department_id = 10;

    FORALL i IN v_employees.FIRST .. v_employees.LAST
        INSERT INTO employees_backup VALUES v_employees(i);

    COMMIT;
END;
/

설명

  • BULK COLLECT: 데이터를 메모리에 한꺼번에 로드하여 처리 속도 향상.
  • FORALL: 반복 작업을 최적화하여 실행 속도 개선.

4. 배치 처리 시 유의사항

  1. 트랜잭션 관리

    • 대량 데이터를 처리할 때 트랜잭션 크기를 적절히 설정하여 메모리 오버헤드를 방지합니다.
    • 너무 큰 트랜잭션은 데이터베이스의 성능에 부정적 영향을 미칠 수 있습니다.
  2. 성능 최적화

    • 인덱스 및 파티션을 활용하여 성능을 개선합니다.
    • 가능한 경우 DIRECT PATH INSERT를 사용해 성능을 극대화합니다.
  3. 오류 처리

    • 배치 처리 중 발생한 오류를 로그에 기록하고, 작업을 재시도할 수 있는 메커니즘을 구현합니다.
    • 트리거 또는 제약 조건으로 인해 오류가 발생하지 않도록 데이터 유효성을 사전에 검증합니다.
  4. 병렬 처리

    • DBMS_PARALLEL_EXECUTE를 사용하여 대량 작업을 병렬로 나누어 처리합니다.

5. 결론

오라클 배치 처리는 대량 데이터 작업에서 필수적인 기술이며, 효율적인 처리 방법과 자동화를 통해 데이터베이스 성능을 향상할 수 있습니다. 이 글에서 설명한 SQL*Plus, PL/SQL 블록, Scheduler, JDBC, BULK COLLECT 등 다양한 방법을 활용하여 자신만의 배치 처리를 설계해 보세요.

위 내용을 참고하여 블로그에 작성하면, 오라클 배치 처리에 대한 완성도 높은 자료가 될 것입니다!

반응형

+ Recent posts