以直接模式运行的Oracle SQL *加载程序比传统路径加载慢得多

时间:2011-08-17 08:09:28

标签: performance oracle sql-loader

在过去的几天里,我一直在使用Oracle的SQL * Loader来尝试将数据批量加载到Oracle中。在尝试了不同的选项组合后,我惊讶地发现传统的路径负载比直接路径负载运行得快得多。

关于这个问题的一些事实:

  • 要加载的记录数为60K。
  • 加载前目标表中的记录数为7亿。
  • Oracle版本为11g r2。
  • 数据文件包含日期,字符(ascii,无需转换),整数,浮点数。没有blob / clob。
  • 表由散列分区。散列函数与PK相同。
  • 当服务器有16个CPU时,表的并行设置为4。
  • 索引是本地分区的。索引的并行(来自ALL_INDEXES)是1。
  • 目标表上只有1个PK和1个索引。使用索引构建PK约束。
  • 检查索引分区显示分区之间的记录分布非常均匀。
  • 数据文件已分隔。
  • 使用APPEND选项。
  • 通过SQL选择和删除已加载的数据非常快,几乎是即时响应。

使用传统路径,加载在大约6秒内完成。

对于直接路径加载,加载大约需要20分钟。最糟糕的运行需要1.5小时 完成但服务器根本不忙。

如果启用了skip_index_maintenance,直接路径加载将在2-3秒内完成。

我已经尝试了很多选项,但没有一个能给出明显的改进......难以置信,分类索引,多线程(我在多CPU服务器上运行SQL * Loader)。他们都没有改善这种情况。

这是在SQL * Loader以直接模式运行期间我一直看到的等待事件:

  • 事件:db file sequential read
  • P1 / 2/3:file#,block#,blocks(从dba_extents检查它是一个索引块)
  • 等待类:用户I / O

有没有人知道直接路径加载出了什么问题?或者有什么我可以进一步检查,以真正挖掘问题的根本原因?提前谢谢。

1 个答案:

答案 0 :(得分:3)

我猜你正在堕落这个

“将相对较少的行加载到大型索引表中

在直接路径加载期间,现有索引在与新索引键合并时会被复制。如果现有索引非常大并且新键的数量非常小,那么索引复制时间可以抵消直接路径加载所节省的时间。“

从何时使用常规路径加载:http://download.oracle.com/docs/cd/B14117_01/server.101/b10825/ldr_modes.htm