SELECT、JOIN、CTAS 載入內表,**不可 DML/建索引**。ORACLE_LOADER(文本/CSV)、ORACLE_DATAPUMP(二進制 dump)、ORACLE_HIVE/ORACLE_HDFS(大數據)。
# Linux
mkdir -p /oracle/ext
# 假設 alert.log 已存在或定期轉儲至此
CREATE USER ext_user IDENTIFIED BY "Pass#123" DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
GRANT CREATE SESSION, CREATE TABLE, CREATE ANY DIRECTORY TO ext_user;
CONN ext_user/Pass#123
CREATE DIRECTORY ext_dir AS '/oracle/ext';
GRANT READ, WRITE ON DIRECTORY ext_dir TO ext_user;
CREATE TABLE alert_log_ext (
log_date VARCHAR2(30), -- 如 "2024-05-17 10:30:45"
severity VARCHAR2(10), -- ERROR/WARNING/INFO
module VARCHAR2(50), -- 產生模組
message VARCHAR2(4000) -- 正文
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
LOGFILE ext_dir:'alert_load.log'
BADFILE ext_dir:'alert_load.bad'
DISCARDFILE ext_dir:'alert_load.dsc'
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
REJECT ROWS WITH ALL NULL FIELDS
)
LOCATION ('alert.log')
)
REJECT LIMIT UNLIMITED;
關鍵參數解析:
FIELDS TERMINATED BY '|':假設預處理腳本已將日志規範為管道分隔。REJECT LIMIT UNLIMITED:允許所有錯誤行進 BADFILE,不中斷查詢。LOGFILE/BADFILE/DISCARDFILE:自動生成載入診斷文件。
SELECT * FROM alert_log_ext WHERE severity = 'ERROR' AND log_date > '2024-05-01';
CREATE TABLE alert_log_int
PARTITION BY RANGE (log_dt) (
PARTITION p_202405 VALUES LESS THAN (DATE '2024-06-01'),
PARTITION p_202406 VALUES LESS THAN (DATE '2024-07-01')
)
PARALLEL 4
AS
SELECT
TO_DATE(SUBSTR(log_date,1,19), 'YYYY-MM-DD HH24:MI:SS') AS log_dt,
severity, module, message
FROM alert_log_ext;
CREATE TABLE json_ext (doc CLOB)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY '}{' -- 假設每行一個 JSON 對象
FIELDS (doc CHAR(10000))
)
LOCATION ('events.json')
);
-- 18c+ 直接 SQL/JSON 查詢
SELECT jt.*
FROM json_ext je,
JSON_TABLE(je.doc, '$' COLUMNS (
event_id NUMBER PATH '$.id',
event_type VARCHAR2(20) PATH '$.type',
payload VARCHAR2(4000) PATH '$.payload'
)) jt;
| 場景 | 優化手段 |
|---|---|
| 大文件頻繁查詢 | 建立內部表分區 + 物化視圖預聚合 |
| 並行讀取 | PARALLEL n + 文件預分片(多文件 LOCATION) |
| 字符集不匹配 | CHARACTERSET AL32UTF8 在 ACCESS PARAMETERS 指定 |
| 異常行阻塞 | REJECT LIMIT 1000 限制錯誤容忍度 |
| 權限不足 | OS 層確保 Oracle 進程讀取權限(組/用戶) |
| 特性 | 外部表 | SQL*Loader | Data Pump |
|---|---|---|---|
| 語法 | SQL DDL | 控制文件 | expdp/impdp 命令 |
| 可查詢性 | 即時 SELECT | 否(僅載入) | 否(僅匯入) |
| 並行 | 支援 | 支援 (DIRECT=Y) | 原生並行 |
| 轉換邏輯 | SQL 函數/CASE | 控制文件表達式 | REMAP/EXCLUDE 等 |
| 適用場景 | 日志分析、臨時文件探查、ETL 階段 | 大批量初始載入 | 庫級遷移、備份恢復 |
外部表將「OS 文件」變為「可查詢關係表」,是構建 Data Lake、日志審計、異構數據接入的輕量級利器。