0

我有一些非常大的表(无论如何对我来说),如数百万行。我正在从遗留系统加载它们,并且需要很长时间。假设硬件没问题,那就快了。我怎样才能加快速度?我尝试从一个系统导出到 CSV 并使用 Sql 加载器 - 慢。我还尝试了从一个系统到另一个系统的直接链接,因此没有中间 csv 文件,只需从一个负载卸载到另一个。

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

正在使用的是 Oracle 11g。

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

4

3 回答 3

2

你可以尝试什么:

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

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

于 2011-10-04T13:54:30.513 回答
1

正如 Jens Schauder 所建议的,如果您可以通过 DB 链接连接到您的源遗留系统,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))
于 2011-10-04T14:32:20.900 回答
1

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

SELECT FORCE_logging from v$database;

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

SELECT TABLESPACE_name,FORCE_logging from DBA_tablespaces

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

SELECT LOG_mode from v$database;

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

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

于 2011-10-04T14:56:51.560 回答