【问题标题】:Best practices for huge volumes of data load/unload?大量数据加载/卸载的最佳实践?
【发布时间】:2011-04-17 13:18:56
【问题描述】:

我的问题适用于 ETL 场景,其中转换是在数据库之外(完全)执行的。 如果您要提取、转换和加载大量数据(20+ 百万条记录或更多)并且涉及的数据库是:Oracle 和 MSSQL Server,那么最好的方法是:

  1. 有效地从源数据库中读取:有没有一种方法可以避免通过网络进行所有查询?我听说过有关直接路径提取方法/批量卸载方法的好消息——我不太确定它们是如何工作的,但我想我需要一个转储文件来进行任何类型的非基于网络的数据读取/导入?
  2. 有效地编写转换后的 数据到目标数据库?:应该 我考虑 Apache Hadoop?会吗 帮助我开始我的转变和 将我的所有数据并行加载到 目标数据库? - 可不可能是 比说,Oracle 的批量加载更快 效用?如果没有,有没有办法 远程调用批量加载实用程序 Oracle/MSSQL 服务器?

欣赏您的想法/建议。

【问题讨论】:

  • 数据的大小(以千兆字节为单位)是多少?
  • 您是否总是为源和目标使用相同的数据库?也就是说,您是否总是从 Oracle 转到 SQL Server,反之亦然?您可以构建特定于数据库的提取和加载代码吗?或者您是否正在尝试构建与数据库无关的 ETL 流程?
  • @jonearles 不幸的是,我没有尺码信息。但是,我们假设它足够大,通过网络链接传输它需要一个多小时。
  • @Justin 不一定总是 - 但大多数时候,我可以为源和目标使用相同的数据库。我很少会从 Oracle 到 SQL Server 进行 ETL,反之亦然。目前,提取和加载是通过 jdbc 在 db 环境之外发生的,所以是的,到目前为止,ETL 过程与数据库无关。但是,我不介意探索可以在提取/加载期间大大提高性能的方法,即使我要编写特定于 db 的代码。目前,我的产品只支持 3 个数据库——Oracle、MSSQL 和 Sybase。

标签: database oracle design-patterns architecture


【解决方案1】:

如果您将数据提取到平面文件中,您可以使用 Oracle 外部表将文件直接读入 oracle。此时,您可以执行直接路径插入 (/*+ append */) 来执行必要的转换。此外,如果表没有记录,您将节省重做成本,但需要考虑到数据可能会丢失/需要在下次备份之前在介质故障的情况下重新加载。

此外,如果数据是基于时间的,请考虑使用分区和分区交换。您可以通过上述方法将数据加载到无索引的临时表中,创建必要的索引(同样可能作为 NOLOGGING),这比在插入期间维护索引要快,然后将分区“交换”到主表中。

【讨论】:

    【解决方案2】:

    我总是会为此使用数据库的批量加载工具。批量装载的远程控制是一个系统管理员问题;总有办法做到这一点。

    这意味着 ETL 的前两个阶段是为批量加载工具生成正确文件格式的应用程序,最后一个阶段是调用批量加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-18
      • 2018-12-06
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      相关资源
      最近更新 更多