5

我有 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 加载了这些文件,但这需要很长时间。我最近了解了外部表。从战略角度来看,哪种方法更好?外部表如何工作?谢谢你。

4

1 回答 1

3

External Tables 和 SQL*Loader 的记录解析非常相似,因此通常相同的记录格式不会有很大的性能差异。但是,在以下情况下,外部表可能更合适:

  • 您希望在将数据加载到数据库时对其进行转换。
  • 您想要加载数据,并且需要对临时表进行附加索引。
  • 您想使用透明的并行处理,而不必先拆分外部数据。

但是,在以下情况下,请使用 SQL*Loader 以获得最佳加载性能:

  • 您想远程加载数据。
  • 不需要对数据进行转换,也不需要并行加载数据。

为了提高 SQL*Loader 的性能,提出了以下建议。

  • 在加载过程中,您的加载表上没有任何索引和/或约束(主键)
  • 在命令行中添加以下选项:DIRECT=TRUE。这将通过使用直接路径加载器而不是传统的路径加载器来绕过大部分 RDBMS 处理。但是,在某些情况下您不能使用直接加载。这些限制可以从 Oracle Server Utilities Guide 中获得
  • 使用固定宽度数据而不是分隔数据。对于分隔数据,每条记录都需要扫描分隔符
  • 尽量避免字符集转换,因为转换是时间和 CPU 密集型的
  • 对于常规路径,使用 READSIZE 和 BINDSIZE 参数。
    READSIZE 将在每次读取系统调用时获取更大的数据块。BINDSIZE 参数指定绑定数组的大小,该数组又指定每批将加载的行数

来源:http: //download.oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/sql_loader_faq.pdf

于 2012-01-02T02:47:19.947 回答