改善 SQL*Loader 的性能:调整直接路径加载中的日期缓存

本技术说明是有关改善 SQLLoader 性能系列中的第一个说明。它介绍了在直接路径加载过程中调整 SQLLoader 日期缓存来提高性能的步骤。而在讨论调整日期缓存之前,我们先来简要回顾一下 SQL*Loader 加载方法。

数据加载方法

SQLLoader 提供两种数据加载方法:常规路径加载 和直接路径加载。常规路径加载执行 SQL INSERT 语句来填充 Oracle 数据库中的表。当 SQLLoader 执行常规路径加载时,它会与所有其他进程公平竞争缓冲区资源,这样可能会明显降低加载速度。

直接路径加载则通过对 Oracle 数据块进行格式化并将数据块直接写入数据库文件中,减少了很多数据库开销。它不会与其他用户竞争数据库资源,因此加载数据的速度通常可以接近磁盘速度。大量的数据可以以并行方式加载,从而获得最高性能。(使用直接路径加载有一些限制,请参阅 Oracle 数据库实用程序 10g 手册 的第 11 章。)

调整直接路径加载中的日期缓存

如果正您执行的直接路径加载中需要多次加载同一日期或时间戳记值,则转换日期和时间戳记数据可能会占用大部分加载时间。您可以使用 SQL*Loader 日期缓存来改善性能。

日期缓存可以在输入数据中存在多个重复值时减少所执行的日期转换次数。它使您能够指定加载过程中预期的不同日期的数量。

日期缓存由直接路径加载用来加快文本与 Oracle 日期列之间的转换。日期缓存还可以用在为要加载到字符列的字符串指定了日期格式的字符串的情形。在这种情形下,将输入字符串转换为一个日期,确保它是指定格式的有效日期。

每个不同的日期字符串都会在缓存中获取一个条目。如果表中不同日期的数量超过了日期缓存的大小,则会禁用日期缓存。表中的所有日期列共享同一个日期缓存。日期字符串(即为字符串指定的日期格式)以及该日期字符串所用的语言会组合成一个唯一的条目。

例如,如果列 D1 的数据与已经为另一个日期列 D2 转换的日期值共享相同的日期格式、字符串值和语言,则直接路径加载器会使用这个已经为 D2 计算的日期值。这种方式会防止影响性能的不必要转换。

如果您知道重复日期字符串的数量很少,或者不同日期字符串的数量很多,则可以通过在命令行指定 DATE_CACHE=0 来禁用日期缓存。

SQL*Loader 日志文件

有关加载过程中日期缓存使用情况的信息会输出到 SQL* Loader 日志文件的最后。您可以使用此信息来改善直接路径加载的性能。

例如,如果日期缓存在加载过程中没有溢出,则日志文件中的信息将如下所示:Date Cache Statistics for table SYS_SQLLDR_X_EXT_TKLDC1 Max Size: 1000 Entries: 353 Hits: 748 Misses: 0Max Size 为缓存中条目的最大数量。默认情况下,日期缓存大小为 1,000 个元素,但是这个大小可以使用 SQL*Loader DATE_CACHE 命令行参数更改。

Entries 是加载中遇到的不同日期的数量。

Hits 是由于已经转换了相同的值而不需发生的转换次数。

Misses 是与日期缓存中的条目未匹配的日期字符串的数量。

如果日期缓存溢出,则会在日志文件中显示下列消息:Date conversion cache disabled due to overflow (default size: 1000)消息中的 default size 是 DATE_CACHE 命令行参数指定的条目数量。如果您在日志文件中看到了此消息,则可能要试着增加日期缓存的大小,或者通过在 SQL*Loader 命令行指定 DATE_CACHE=0 来禁用该缓存。

结论

当您执行直接路径加载时,如果其中要多次加载相同的日期或时间戳记值,请记得使用 SQLLoader 日期缓存来改善 SQLLoader 性能。