Oracle 外部表 External Table 是什么?和 SQL*Loader 有什么区别?
简化版
Oracle 外部表把数据库外部文件映射成表,让用户可以用 SQL 查询文件数据。它适合数据装载、校验和 ETL 中间处理;SQL*Loader 更偏批量装载工具。外部表不存储数据本体,性能、权限和文件目录管理要注意。
详细版
外部表定义了文件位置、格式和字段映射:
CREATE TABLE ext_users (
id NUMBER,
name VARCHAR2(100)
)
ORGANIZATION EXTERNAL (...)
REJECT LIMIT UNLIMITED;
查询时 Oracle 读取外部文件,把它当表扫描。适合先用 SQL 过滤、校验、转换,再插入正式表。
它依赖 DIRECTORY 对象和数据库服务器文件权限,不适合高并发 OLTP 查询,也不能像普通表一样更新文件内容。
完整版教学
一、外部表解决什么问题
很多数据先以 CSV、文本文件形式到达数据库服务器。传统方式是先用工具导入临时表,再写 SQL 校验。
外部表把“文件”包装成“表”,让你可以直接对文件写 SQL。
CSV 文件 -> External Table -> SELECT/INSERT INTO 正式表
这对 ETL、批量导入前校验和数据交换很方便。
二、基本组成
外部表需要表结构、文件目录、访问驱动和格式定义。目录通常由 Oracle DIRECTORY 对象表示。
CREATE DIRECTORY data_dir AS '/data/import';
GRANT READ ON DIRECTORY data_dir TO app_user;
数据库进程读取服务器上的文件,不是读取你客户端电脑上的文件。这个区别很重要。
三、和 SQL*Loader 的区别
SQL*Loader 是外部装载工具,适合大批量导入;外部表是数据库对象,可以用 SQL 查询和转换。
| 维度 | 外部表 | SQL*Loader |
|---|---|---|
| 使用方式 | SQL 查询文件 | 命令行装载 |
| 适合 | 校验、转换、ETL | 高效批量导入 |
| 数据存储 | 文件外部存在 | 导入数据库表 |
| 灵活性 | 可 join/filter | 装载配置强 |
实际项目里两者不是互斥关系,要按流程选择。
四、错误处理和坏数据
导入文件常有坏行。外部表可以配置 reject limit,也可以把错误记录到 bad file 或 log file,具体取决于访问驱动配置。
如果 100 万行里有 500 行脏数据,直接导正式表可能失败;外部表可以先筛出不合法数据,再决定修复或丢弃。
这就是外部表在数据治理里的价值:让文件数据先接受 SQL 层校验。
五、限制和安全
外部表通常不适合频繁 OLTP 查询,因为每次要读外部文件,缺少普通表索引和缓存行为。它更像导入入口,不是业务表替代品。
权限上要控制 DIRECTORY 的 READ/WRITE,避免数据库用户读取不该读的服务器文件。文件路径、文件名和作业权限都要纳入运维规范。
外部表暴露的是文件访问能力,安全边界不能忽略。
六、常见误区与追问
- 误区:外部表会把文件数据存进数据库。 它主要映射外部文件,数据本体仍在文件中。
- 误区:外部表适合替代普通业务表。 它适合导入和 ETL,不适合高并发业务查询。
- 误区:外部表读取客户端文件。 它读取数据库服务器可访问的目录文件。
- 追问:为什么要 DIRECTORY 对象? 用来控制数据库可访问的服务器目录和权限。
- 追问:外部表和 SQL*Loader 怎么选? 需要 SQL 校验转换用外部表,纯高速装载可用 SQL*Loader。
七、加强记忆
记忆钩子:外部表像给 CSV 文件贴了一张数据库表皮,能用 SQL 看它,但它骨子里还是文件。
回答这题要讲“文件映射、DIRECTORY、ETL 校验、和 SQL*Loader 的差异、权限风险”。这样不会把外部表误解成普通表。