使用“已锁定”截断/填充从Oracle中的视图填充表

时间:2014-05-06 20:23:26

标签: sql oracle

我想按计划在(可能很大的)视图中填充表格。

我的流程是:

  • 禁用表格上的索引
  • 截断表
  • 将数据从视图复制到表格
  • 启用表格上的索引

在SQL Server中,我可以将进程包装在一个事务中,这样当我截断表时,架构修改锁将一直保持到我提交为止。这实际上意味着在整个过程完成之前,没有其他过程可以插入/更新/等等。

但是我知道在Oracle中,truncate table语句被认为是DDL,因此会发出一个隐式提交。

所以我的问题是如何在这里模仿SQL Server的行为?在我截断和(重新)填充表格时,我不希望任何其他进程尝试插入/更新/等等。我也希望我的其他过程不会发现任何锁定。

提前致谢。

1 个答案:

答案 0 :(得分:2)

使您的表成为具有单个分区和本地索引的分区表。然后每当你需要刷新时:

  • 将数据从视图复制到新的临时表

    CREATE TABLE tmp AS SELECT ... FROM some_view;
    
  • 使用临时表交换分区:

    ALTER TABLE some_table
    EXCHANGE PARTITION part WITH TABLE tmp
    WITHOUT VALIDATION;
    

该表仅在分区交换期间被锁定,在没有验证和全局索引更新的情况下,该表应该是即时的。