Oracle

Oracle Bulk Insert: 각 언어별 샘플 코드와 효율적인 데이터 삽입 방법

지오준 2024. 8. 23. 10:00
반응형

Oracle 데이터베이스에서 대량의 데이터를 삽입하는 방법은 성능 최적화의 중요한 요소입니다. 대량 데이터 삽입은 잘못된 방법으로 수행될 경우 성능이 저하될 수 있기 때문에, 이를 효율적으로 처리하기 위해 각 프로그래밍 언어에서 제공하는 방법들을 이해하는 것이 중요합니다. 이 글에서는 SQL, PL/SQL, Python, Java, 그리고 C#에서 Oracle에 대량 데이터를 삽입하는 방법을 예제 코드와 함께 설명합니다.


1. SQL 및 PL/SQL에서의 대량 삽입

Oracle SQL에서는 기본적으로 INSERT INTO ... SELECT 구문을 통해 데이터를 대량으로 삽입할 수 있습니다. 이 방법은 주로 다른 테이블로부터 데이터를 복사하여 삽입할 때 사용됩니다.

1.1 SQL에서의 예시

INSERT INTO target_table (column1, column2, column3)
SELECT source_column1, source_column2, source_column3
FROM source_table;

이 방법은 target_table에 source_table로부터 데이터를 가져와 삽입합니다. 인덱스가 없거나 제약 조건이 많지 않은 경우 특히 효율적입니다.

1.2 PL/SQL에서의 예시

PL/SQL은 Oracle에서 절차적 로직을 처리하기 위해 사용됩니다. 대량 데이터 삽입의 경우 FORALL 구문을 사용하여 반복적인 삽입 작업을 최적화할 수 있습니다.

DECLARE
    TYPE data_array IS TABLE OF target_table%ROWTYPE;
    v_data data_array;
BEGIN
    -- 데이터를 로드합니다.
    SELECT * BULK COLLECT INTO v_data FROM source_table;

    -- 데이터를 타겟 테이블에 삽입합니다.
    FORALL i IN v_data.FIRST .. v_data.LAST
        INSERT INTO target_table VALUES v_data(i);
END;
/

BULK COLLECT와 FORALL을 조합하여 다수의 레코드를 한 번에 처리할 수 있으며, 이는 일반적인 INSERT 문을 여러 번 실행하는 것보다 훨씬 효율적입니다.


2. Python에서의 대량 삽입

Python에서는 Oracle과의 인터페이스를 위해 cx_Oracle 라이브러리를 사용할 수 있습니다. 이 라이브러리를 사용하면 Python 코드에서 Oracle 데이터베이스에 연결하여 대량의 데이터를 효율적으로 삽입할 수 있습니다.

2.1 Python에서의 예시

import cx_Oracle

# Oracle 데이터베이스에 연결
connection = cx_Oracle.connect('username/password@hostname/SID')
cursor = connection.cursor()

# 대량 삽입할 데이터 준비
data = [
    (1, 'Value1', 'Value2'),
    (2, 'Value3', 'Value4'),
    # ...
]

# 다중 레코드 삽입
cursor.executemany("""
    INSERT INTO target_table (column1, column2, column3) 
    VALUES (:1, :2, :3)
""", data)

# 변경 사항 커밋
connection.commit()

# 리소스 정리
cursor.close()
connection.close()

executemany() 메소드를 사용하면 다수의 레코드를 한 번에 삽입할 수 있으며, 이는 개별적으로 삽입하는 것보다 성능 면에서 훨씬 효율적입니다.


3. Java에서의 대량 삽입

Java에서는 Oracle JDBC 드라이버를 사용하여 Oracle 데이터베이스에 대량 데이터를 삽입할 수 있습니다. PreparedStatement와 addBatch() 메소드를 조합하면 효율적으로 대량 삽입을 수행할 수 있습니다.

3.1 Java에서의 예시

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

public class BulkInsertExample {
    public static void main(String[] args) {
        String url = "jdbc:oracle:thin:@hostname:port:SID";
        String user = "username";
        String password = "password";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            String sql = "INSERT INTO target_table (column1, column2, column3) VALUES (?, ?, ?)";
            PreparedStatement pstmt = conn.prepareStatement(sql);

            // 데이터 준비
            for (int i = 1; i <= 1000; i++) {
                pstmt.setInt(1, i);
                pstmt.setString(2, "Value" + i);
                pstmt.setString(3, "Value" + (i + 1000));
                pstmt.addBatch(); // 배치에 추가

                if (i % 100 == 0) {
                    pstmt.executeBatch(); // 100개씩 배치 실행
                }
            }

            pstmt.executeBatch(); // 남은 배치 실행
            conn.commit(); // 커밋
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Java에서는 배치 처리를 통해 많은 양의 데이터를 효율적으로 삽입할 수 있습니다. addBatch()로 명령을 누적하고, 일정 수의 배치가 쌓이면 executeBatch()로 실행하여 성능을 최적화합니다.


4. C#에서의 대량 삽입

C#에서는 Oracle 데이터베이스에 연결하기 위해 Oracle.DataAccess.Client 네임스페이스를 사용할 수 있습니다. OracleBulkCopy 클래스를 사용하면 테이블에 대량 데이터를 신속하게 삽입할 수 있습니다.

4.1 C#에서의 예시

using System;
using System.Data;
using Oracle.DataAccess.Client;

class BulkInsertExample {
    static void Main() {
        string connectionString = "User Id=username;Password=password;Data Source=hostname/SID";

        using (OracleConnection conn = new OracleConnection(connectionString)) {
            conn.Open();

            DataTable dt = new DataTable();
            dt.Columns.Add("column1", typeof(int));
            dt.Columns.Add("column2", typeof(string));
            dt.Columns.Add("column3", typeof(string));

            // 데이터 준비
            for (int i = 1; i <= 1000; i++) {
                dt.Rows.Add(i, "Value" + i, "Value" + (i + 1000));
            }

            using (OracleBulkCopy bulkCopy = new OracleBulkCopy(conn)) {
                bulkCopy.DestinationTableName = "target_table";
                bulkCopy.WriteToServer(dt);
            }
        }
    }
}

C#에서는 OracleBulkCopy 클래스를 활용해 DataTable에 데이터를 담아 한 번에 대량으로 삽입할 수 있습니다. 이는 SQL Server의 SqlBulkCopy와 유사한 기능을 제공합니다.


이와 같이 Oracle에 대량의 데이터를 삽입하는 방법은 사용하는 언어에 따라 다르지만, 각 언어에서 제공하는 기능을 잘 활용하면 효율적이고 빠르게 데이터를 처리할 수 있습니다. 대량 데이터 처리 시에는 네트워크 지연, 인덱스, 제약 조건 등 여러 요인을 고려하여 최적의 방법을 선택하는 것이 중요합니다.

반응형