Oracle

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

지오준 2024. 8. 23.
반응형

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

반응형

댓글