【发布时间】: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)。