每天截断Oracle表的问题

时间:2016-06-07 16:09:18

标签: oracle ddl truncate dml

假设有一个临时表,它有一些索引,在其上定义了约束。进程每天都会将数据转储到此表中。每天几百万行。另一个过程也是每天从表中获取数据。 一旦阅读,那天数据就不再值了,所以没有必要将数据保存在表格中。

当前的解决方案是截断表(而不是“从表中删除”,因为考虑索引和约束需要花费很长时间)并且每天加载数据。

我的问题是,在每天截断表格时是否存在任何技术问题?

PS:使用Oracle Database 11g企业版11.2.0.3.0版 - 64位

2 个答案:

答案 0 :(得分:3)

不,截断登台表绝对没有问题。事实上,在处理数据后,它是一种标准的数据仓库实践,可以截断登台表。但是,我建议如下。

  • 最好在开头截断登台表 进程(就在从登陆或源加载数据之前) 表)。如果程序在下游进程中填充了一些不良或不一致的数据,这将使您可以灵活地进行任何调试或数据分析。
  • Truncate是一个DDL操作,它将发出一个隐式提交,因此相关会话中截断表之前的所有操作都将被提交,你将无法将其回滚。

答案 1 :(得分:2)

应该注意 staging interface 表之间的区别。典型的临时表在ETL过程的控制下已满,例如在此日常生命周期中:

  • 截断表
  • 在表格中加载数据
  • 从表中选择数据以获取更多步骤。

相反,如果表由不受ETL作业控制的进程填充,我将其称为 interface 表。

如果数据生成作业是按固定时间表每天运行一次的批处理,则与之前的情况没有区别,并且定期截断是正常的。

如果数据生成作业在未知时间和/或一天运行几次,则应采取一些措施。

包含未提交数据的表的截断失败并带有

SQL-Fehler: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

在这种情况下(数据可能以未知的时间表生成),更好的解决方案是使用分区表(例如,使用每日interval partition模式)。

  • 生产者作业将数据写入当前分区。

  • 在一段保留时间(x天)之后,消费者 DROP 是旧分区。

这会隔离生产者和消费者,并提供一些调试和/或重新启动负载的历史记录。