【问题标题】:Locking table for more transactions锁定表以进行更多事务
【发布时间】:2013-06-11 11:14:24
【问题描述】:

我正在使用 Oracle 11g。

我正在尝试通过重建索引来实现并发加载到表中的场景。我几乎没有试图实现这种情况的流程: 1.从源加载数据, 2. 转换数据, 3.关闭DWH表上的索引, 4.将数据加载到DWH中, 5. 在 DWH 表上重建索引。 我关闭并重建索引以获得更好的性能,在某些情况下,一个流程正在重建索引,而另一个流程试图将其关闭。我需要做的是在第 2 点和第 3 点之间放置一些锁,这将在第 5 点之后释放。

Oracle 内置LOCK TABLE 机制是不够的,因为锁是在事务结束时释放的,所以任何ALTER 语句都会释放锁。

问题是如何解决问题?

【问题讨论】:

    标签: sql oracle data-warehouse locks


    【解决方案1】:

    问题解决了。使用 DBMS_LOCK 包可以轻松实现我想做的事情。

    1. DBMS_LOCK.REQUEST(...)
    2. ALTER INDEX ... UNUSABLE
    3. Load data
    4. ALTER INDEX ... REBUILD
    5. DBMS_LOCK.RELEASE(...)
    

    【讨论】:

      【解决方案2】:

      您可以使用 DBMS_SCHEDULER:

      1. 运行加载和转换数据的作业
      2. 关闭索引
      3. 运行将数据加载到 DWH 中的作业
      4. 重建索引

      使用链:

      【讨论】:

      • 这需要对当前架构进行相当大的改变,我需要使用锁来解决这个问题。
      • 你能创建状态表吗?如果上一步未完成,某些过程/SQL 将不会运行。也许你有日志表?它会工作得很好。
      • 您可以在不干扰“架构”的情况下动态创建作业。 1)创造工作。 2)运行它。 3) 放弃工作。
      【解决方案3】:

      您必须在插入时间的分钟/小时基础上对表进行范围分区,并仅在时间到时启用索引。每个分区应在创建后禁用所有索引。只有一个进程可以启用索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        • 2011-06-07
        • 1970-01-01
        相关资源
        最近更新 更多