반응형
외부 테이블은 Oracle 데이터베이스에서 외부 파일의 데이터를 마치 데이터베이스 테이블처럼 조회할 수 있게 해주는 강력한 기능입니다. ETL 작업이나 대용량 데이터 로딩에 특히 유용합니다.
1. 외부 테이블의 특징
1.1 주요 특징
- 외부 파일을 데이터베이스 테이블처럼 조회 가능
- 기본적으로 읽기 전용
- SQL 문을 통한 데이터 조회 가능
- 일반 테이블과의 조인 가능
- 병렬 처리 지원
1.2 장점
- 데이터 웨어하우스 로딩 작업 단순화
- 이기종 데이터 소스 통합
- 스키마 온 리드(Schema-on-Read) 구현
- ETL 프로세스 최적화
2. 외부 테이블 생성 방법
2.1 디렉토리 객체 생성
-- 관리자 권한 필요
CREATE DIRECTORY ext_data_dir AS '/oracle/external/data';
GRANT READ, WRITE ON DIRECTORY ext_data_dir TO scott;
2.2 기본 외부 테이블 생성
CREATE TABLE emp_ext (
emp_id NUMBER,
emp_name VARCHAR2(100),
salary NUMBER,
hire_date DATE
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(
emp_id CHAR(5),
emp_name CHAR(100),
salary CHAR(10),
hire_date DATE "YYYY-MM-DD"
)
)
LOCATION ('employees.csv')
)
REJECT LIMIT UNLIMITED;
2.3 ORACLE_DATAPUMP 사용 예제
CREATE TABLE sales_ext
ORGANIZATION EXTERNAL (
TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY ext_data_dir
LOCATION ('sales.dmp')
)
AS SELECT * FROM sales WHERE year = 2023;
3. 고급 활용 예제
3.1 다중 파일 처리
CREATE TABLE sales_multi_ext (
sale_date DATE,
product_id NUMBER,
amount NUMBER
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
(
sale_date DATE "YYYY-MM-DD",
product_id INTEGER EXTERNAL,
amount INTEGER EXTERNAL
)
)
LOCATION (
'sales_2023.csv',
'sales_2024.csv'
)
);
3.2 병렬 처리 활용
-- 병렬 처리를 사용한 데이터 로딩
INSERT /*+ APPEND PARALLEL(sales_target, 4) */
INTO sales_target
SELECT /*+ PARALLEL(s, 4) */
sale_date,
product_id,
amount
FROM sales_ext s;
3.3 데이터 변환과 필터링
CREATE TABLE transformed_ext (
order_id NUMBER,
order_date DATE,
total_amount NUMBER
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
(
order_id CHAR(10),
order_date CHAR(10) DATE_FORMAT DATE MASK "YYYY-MM-DD",
total_amount CHAR(15) FLOAT EXTERNAL
)
)
LOCATION ('orders.csv')
)
REJECT LIMIT UNLIMITED;
4. 실제 활용 사례
4.1 ETL 프로세스
-- 스테이징 테이블로 데이터 로드
CREATE TABLE stage_sales AS
SELECT *
FROM sales_ext
WHERE sale_date >= DATE '2024-01-01';
-- 데이터 변환 및 정제
INSERT INTO sales_dwh
SELECT
TO_CHAR(sale_date, 'YYYYMM') as sale_month,
product_id,
SUM(amount) as total_amount,
COUNT(*) as transaction_count
FROM stage_sales
GROUP BY
TO_CHAR(sale_date, 'YYYYMM'),
product_id;
4.2 로그 파일 분석
CREATE TABLE log_analysis_ext (
log_time TIMESTAMP,
level VARCHAR2(10),
message CLOB
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY log_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY '|'
(
log_time CHAR(23) DATE_FORMAT TIMESTAMP MASK "YYYY-MM-DD HH24:MI:SS.FF",
level CHAR(10),
message CHAR(4000)
)
)
LOCATION ('app_log.txt')
);
5. 성능 최적화
5.1 파티셔닝 활용
CREATE TABLE sales_ext_part (
sale_date DATE,
product_id NUMBER,
amount NUMBER
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
)
LOCATION (
'sales_2023Q1.csv',
'sales_2023Q2.csv'
)
)
PARTITION BY RANGE (sale_date)
(
PARTITION sales_q1_2023 VALUES LESS THAN (DATE '2023-04-01'),
PARTITION sales_q2_2023 VALUES LESS THAN (DATE '2023-07-01')
);
5.2 인덱스 활용
-- 외부 테이블 데이터를 기반으로 한 구체화된 뷰 생성
CREATE MATERIALIZED VIEW mv_sales_summary
BUILD IMMEDIATE
REFRESH COMPLETE ON DEMAND
AS
SELECT
TO_CHAR(sale_date, 'YYYYMM') as sale_month,
SUM(amount) as total_sales
FROM sales_ext
GROUP BY TO_CHAR(sale_date, 'YYYYMM');
-- 구체화된 뷰에 인덱스 생성
CREATE INDEX idx_mv_sales_summary ON mv_sales_summary(sale_month);
6. 오류 처리 및 로깅
6.1 리젝트 파일 설정
CREATE TABLE orders_ext (
order_id NUMBER,
order_date DATE,
amount NUMBER
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
BADFILE 'orders.bad'
LOGFILE 'orders.log'
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
)
LOCATION ('orders.csv')
)
REJECT LIMIT 100;
6.2 오류 확인
-- 외부 테이블 처리 중 발생한 오류 확인
SELECT *
FROM ALL_EXTERNAL_TABLES
WHERE TABLE_NAME = 'ORDERS_EXT';
SELECT *
FROM ALL_EXTERNAL_LOCATIONS
WHERE TABLE_NAME = 'ORDERS_EXT';
7. 모니터링 및 관리
7.1 상태 확인
-- 외부 테이블 상태 확인
SELECT owner, table_name, type_name, default_directory_name
FROM ALL_EXTERNAL_TABLES;
-- 외부 테이블 위치 정보
SELECT * FROM ALL_EXTERNAL_LOCATIONS;
-- 외부 테이블 컬럼 정보
SELECT column_name, data_type, data_length
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = 'SALES_EXT';
8. 보안 고려사항
- 디렉토리 객체 권한
- 필요한 최소 권한만 부여
- 정기적인 권한 검토
- 파일 시스템 보안
- 외부 파일에 대한 적절한 파일 시스템 권한 설정
- 중요 데이터 암호화 고려
외부 테이블은 Oracle 데이터베이스에서 외부 데이터를 효율적으로 처리할 수 있는 강력한 기능입니다. ETL 프로세스, 로그 분석, 데이터 마이그레이션 등 다양한 용도로 활용할 수 있으며, 적절한 설정과 관리를 통해 높은 성능과 안정성을 확보할 수 있습니다.
반응형