假设有一个临时表,它有一些索引,在其上定义了约束。进程每天都会将数据转储到此表中。每天几百万行。另一个过程也是每天从表中获取数据。 一旦阅读,那天数据就不再值了,所以没有必要将数据保存在表格中。
当前的解决方案是截断表(而不是“从表中删除”,因为考虑索引和约束需要花费很长时间)并且每天加载数据。
我的问题是,在每天截断表格时是否存在任何技术问题?
PS:使用Oracle Database 11g企业版11.2.0.3.0版 - 64位
答案 0 :(得分:3)
不,截断登台表绝对没有问题。事实上,在处理数据后,它是一种标准的数据仓库实践,可以截断登台表。但是,我建议如下。
答案 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 是旧分区。
这会隔离生产者和消费者,并提供一些调试和/或重新启动负载的历史记录。