2016-11-15 92 views
1

我有一个ETL过程将数据加载到目标表A中。我们创建了另一个表B,它与结构 中的目标表相同,并且此表由报告组访问生成报告。现在,无论何时将数据加载到目标表A中,都会调用存储过程,将表B重命名为表Temp,将表B重命名为Table A,将表A重命名为Temp。这样做是为了尽量减少报告生成的停机时间。表重命名和交换分区之间的区别

这样报表总是访问最新的数据。现在我的问题是我可以在表B上创建一个分区,并使用交换分区机制来交换A和分区表B的段。那么你能告诉我哪一个更好的方法,以及表重命名的交换分区有多不同。

+0

@George它是有可能的两个分区的目标表和ETL过程加载数据P1和P2到目标表的patition P1,然后使用交换分区,我们可以交换分区P2与分区P1。 P1将用于ETL和P2将用于报告...这种设计是否可能使用Exchange分区机制? – Dex

回答

1

当你重命名表对象,它是指静态的对这些表可能会变得无效。所以我宁愿使用交换分区。

交换分区方法的另一个好处是,表A和B可以具有不同的补助:A是具有读取授予最终用户的目标表,B - 是中间表仅由应用程序访问。

它们也可以有不同的索引 - B根本不需要索引。

表A可以存储所有历史数据(在分区)和B仅保存当前生成的中间数据(非分区)。

+0

我同意,如果我有分区选项,我宁愿交换分区,即使分区表只有一个分区。 –

0

我想你必须理解的是,一个表是用一个数据对象合并与一组固有的逻辑元数据(名称,补助金,等)的目的(以及数据对象的元数据,比如行数和其他统计)。

当您重命名表时,您可能会修改关于该表名称字符串解析的对象的所有内容 - 所有表元数据,数据对象及其元数据 - 并且对您的其余部分具有重要意义系统。您现在指向一个不同的对象。

当你交换分区,你正在改变与表对象相关联的数据对象。这固有地对系统的其他部分影响较小,因为表的元数据保持不变,并且您仍然指向相同的逻辑对象。

由于这个原因,我宁愿分区交换到表重命名。

p.s.使用这个隐喻,你也可以考虑一个视图对象在逻辑上与表格对象几乎相同,因为它们都有类似的逻辑元数据。该视图当然没有数据对象,而是有额外的元数据来定义其底层关系。

物化视图也喜欢表,有额外的元数据(类似的观点),并与刷新的目的额外的元数据。

带有延迟段创建的表是尚未创建数据对象的表对象。