我想按计划在(可能很大的)视图中填充表格。
我的流程是:
在SQL Server中,我可以将进程包装在一个事务中,这样当我截断表时,架构修改锁将一直保持到我提交为止。这实际上意味着在整个过程完成之前,没有其他过程可以插入/更新/等等。
但是我知道在Oracle中,truncate table语句被认为是DDL,因此会发出一个隐式提交。
所以我的问题是如何在这里模仿SQL Server的行为?在我截断和(重新)填充表格时,我不希望任何其他进程尝试插入/更新/等等。我也希望我的其他过程不会发现任何锁定。
提前致谢。
答案 0 :(得分:2)
使您的表成为具有单个分区和本地索引的分区表。然后每当你需要刷新时:
将数据从视图复制到新的临时表
CREATE TABLE tmp AS SELECT ... FROM some_view;
使用临时表交换分区:
ALTER TABLE some_table
EXCHANGE PARTITION part WITH TABLE tmp
WITHOUT VALIDATION;
该表仅在分区交换期间被锁定,在没有验证和全局索引更新的情况下,该表应该是即时的。