【问题标题】:Populating a star-schema from a single staging table.从单个临时表填充星型模式。
【发布时间】:2012-09-26 17:37:38
【问题描述】:

从单个临时表填充星型模式的最佳方法是什么。 数据负载有数百万行,星型模式是一个包含 10 个关联维度表的事实表。

场景 1. 首先对维度进行顺序插入,然后在事实表中进行大插入,在该事实表中,我将临时表与更新的维度表连接起来。我最担心的是由于大量数据而并发插入维度/事实表可能会发生锁定。

场景 2。 将数据加载拆分为更小的批次(10k 行)并循环遍历整个 staging 表并以与场景 1 中所述相同的方式插入批次。 em> 我在这里看到的问题是用光标循环遍历一个大表。另外,如果其中一个批次无法插入数据,我需要回滚之前完成的所有插入的更改。

场景 3. 编写一个大的 INSERT ALL 语句并在整个插入期间锁定星型模式。此外,对于锁定问题,我将有一个复杂的插入语句,它必须保存插入语句的所有业务逻辑(调试和维护的噩梦)

【问题讨论】:

  • 你关心什么样的“锁”?使用行级锁定,正常的插入不应该影响其他任何东西。
  • 事实表在键上有索引。我假设在插入期间会有锁。
  • Oracle 只锁定它修改的行。所以除了插入的行(当然是invisible to other transactions until commit)之外,插入没有排他锁。同样在 Oracle write don't block read,永远。表结构上的共享锁不会阻塞其他读取器或写入器(这些锁只会阻止 DDL)。

标签: oracle plsql oracle11g


【解决方案1】:

您可以在 11g 第 2 版(!)中尝试 DBMS_PARALLEL_EXECUTE

http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_parallel_ex.htm#ARPLS233

可以很好地将大表分成较小的块,它可以让您非常轻松地定义并行度。不过,不要在块的处理中使用并行提示或插入追加。

您认为可以毫无问题地加载维度表的假设似乎让我过于乐观。根据我的经验,您必须满足并非所有维度数据信息在加载时都有效的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2018-04-05
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    相关资源
    最近更新 更多