我有 471 个文件,总计约 100GB。这些文件以“\t”分隔,交易数据采用以下格式:
char(10) not null,
char(8) not null,
char(1) not null,
char(4) not null,
number not null,
char(1) not null,
char(1) not null,
char(1) not null,
number not null
文件中事务的顺序很重要,需要保留,最好带有主键 ID。最初,我使用 sqlldr 加载这些文件,但需要很长时间。我最近了解了外部表。从战略角度来看,哪种方法更好?外部表如何工作?谢谢。
最佳答案
外部表和SQL*Loader的记录解析非常相似,所以通常 在相同的记录格式下,没有重大的性能差异。然而, 外部表可能更适合以下情况:
- 您希望在数据加载到数据库时对其进行转换。
- 您想要加载数据,并且需要为临时表建立额外的索引。
- 您希望使用透明并行处理,而不必先拆分外部数据。
但是,在以下情况下,请使用 SQL*Loader 以获得最佳加载性能:
- 您想要远程加载数据。
- 不需要对数据进行转换,也不需要并行加载数据。
为了提高 SQL*Loader 的性能,提出了以下建议。
- 负载上没有任何索引和/或约束(主键) 加载过程中的表
- 在命令行中添加以下选项:DIRECT=TRUE。这会 使用直接路径加载器绕过大部分 RDBMS 处理 而不是传统的路径加载器。然而,也有一些情况 当你不能使用直接负载时。这些限制可以从 Oracle 服务器实用程序指南
- 使用固定宽度数据而不是分隔数据。对于分隔数据,每个 需要扫描记录的分隔符
- 尽量避免字符集转换,因为转换既涉及时间又涉及 CPU 强化
- 对于常规路径,请使用 READSIZE 和 BINDSIZE 参数。
READSIZE 将在每次读取系统调用时获取更大的数据 block 。这 BINDSIZE 参数指定绑定(bind)数组的大小,而该大小又 指定每批将加载的行数
关于Oracle 11gR2加载多个文件: sqlldr or external tables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8694089/