如何加快Oracle表中的数据加载速度?

时间:2011-10-04 13:48:05

标签: oracle oracle11g data-conversion

我有一些非常大的表(无论如何对我来说),就像数百万行一样。我正在从遗留系统加载它们,它将永远消失。假设硬件很好,速度很快。我怎样才能加快速度呢?我已经尝试从一个系统导出到CSV并使用Sql loader - 慢。我也尝试过从一个系统到另一个系统的直接链接,因此没有中间的csv文件,只需从一个负载卸载到另一个负载。

一个人说了一些关于预先登台的事情,并且不知何故可以让事情变得更快。我不知道那是什么,或者它是否有帮助。我希望得到投入。谢谢。

Oracle 11g正在使用中。

更新:我的数据库是群集的,所以我不知道我是否可以做任何事情来加快速度。

3 个答案:

答案 0 :(得分:2)

你可以尝试:

  • 禁用所有约束,仅在加载过程后启用它们
  • CTAS(创建表格为选择)

你真正应该做的是:了解你的瓶颈是什么。是网络,文件I / O,检查约束......然后解决这个问题。对我来说,查看解释计划大部分时间都是第一步。

答案 1 :(得分:1)

正如Jens Schauder建议的那样,如果您可以通过数据库链接连接到源遗留系统,CTAS将是性能和简单性之间的最佳折衷,只要您不需要源端的任何连接。

否则,您应该考虑使用SQL * Loader并调整一些设置。使用直接路径,我可以在6岁的ProLaint上在12分钟内加载100M记录(~10GB)。

编辑:我使用了为Datamation排序基准定义的数据格式。它的生成器在Apache Hadoop发行版中可用。它生成具有固定宽度字段的记录,其中包含99个字节的数据以及每行文件的换行符。我用于上面引用的数字的SQL * Loader控制文件是:

OPTIONS (SILENT=FEEDBACK, DIRECT=TRUE, ROWS=1000)
LOAD DATA
INFILE 'rec100M.txt' "FIX 99"
INTO TABLE BENCH (
BENCH_KEY POSITION(1:10),
BENCH_REC_NBR POSITION(13:44),
BENCH_FILLER POSITION(47:98))

答案 2 :(得分:1)

您使用的配置是什么? 导入数据的数据库是否与备用数据库耦合?如果是这样,很可能启用了force_logging的配置? 您可以使用

进行检查
SELECT FORCE_logging from v$database;

也可以在表空间级别启用它:

SELECT TABLESPACE_name,FORCE_logging from DBA_tablespaces

如果您的数据库正在运行ith force_logging,或者您的表空间有force_logging,这将对导入速度产生影响。 如果不是这种情况,请检查是否已启用存档日志模式。

SELECT LOG_mode from v$database;

如果是这样,可能是档案写得不够快。在这种情况下,增加在线redolog文件的大小。 如果数据库没有运行archivelog模式,它仍然必须写入重做文件,如果不使用直接路径插入。在这种情况下,请检查重做的速度。通常,当索引没有发挥作用时,200GB / h是非常有可能的。

重要的是找到导致性能不足的链接。它可以是输入,也可以是输出。在这里,我专注于输出。