Oracle 在同一架构中的live和archive表中选择并更新

Oracle 在同一架构中的live和archive表中选择并更新,oracle,archive,large-data,Oracle,Archive,Large Data,我正在处理的应用程序目前有一个归档逻辑,其中所有超过6个月的记录都将移动到同一架构中的历史表中,但位于不同的表空间中。这是使用每天执行的存储过程实现的 例如,TABLE_A live,最近6个月==>TABLE_A_H存档,超过6个月,最多8年 到目前为止没有问题。现在,业务部门提出了一个新的要求,即归档数据也应可用于选择和更新。即使是一年前的数据也可能发生更新 可以是直接的,比如 从表A中选择*,其中id='something' 也可以是开放式查询,比如 从创建日期 解决方案1:对于直接选择/

我正在处理的应用程序目前有一个归档逻辑,其中所有超过6个月的记录都将移动到同一架构中的历史表中,但位于不同的表空间中。这是使用每天执行的存储过程实现的

例如,TABLE_A live,最近6个月==>TABLE_A_H存档,超过6个月,最多8年

到目前为止没有问题。现在,业务部门提出了一个新的要求,即归档数据也应可用于选择和更新。即使是一年前的数据也可能发生更新

可以是直接的,比如

从表A中选择*,其中id='something'

也可以是开放式查询,比如

从创建日期<'XYZ'的表格A中选择*

更新通常针对特定记录

这些查询作为REST服务公开给客户端。存在垃圾/空值的可能性,应用程序无法清理输入

数据库的当前快照为

父表10M记录,每条记录10-15K 子表\u一条28M记录,每条记录少于1K CHILD_TABLE_两条25M记录,每条记录少于1K CHILD_TABLE_三条46M记录,每条记录少于1K 子表\u四条57M记录,每条记录少于1K

内存不是一个限制-如果需要,我可以获得额外的2 TB空间。 问题是,当它访问归档表时,如何保持较低的响应时间?。 在构建一个解决方案时,我应该考虑哪些方面?p> 解决方案1:对于直接选择/更新,请检查记录是否在活动表中可用。如果存在,请在活动表上执行该操作。如果不是,则对存档表执行该操作

对于开放式查询,请使用UNION

解决方案2:使用逐月分区,并将所有8年的数据保存在一组表中?。oracle是否可以在单个表中高效地处理1.5亿多条记录以进行选择/更新

解决方案3:使用NoSQL,比如Couchbase?。由于涉及基础设施/成本,目前不是可行的解决方案

解决方案4:

技术堆栈:Oracle11g,J2EE应用程序,使用JBoss上托管的Spring/HibernateJava1.6


非常感谢您的回复

如果我是您,我会选择解决方案2,并确保您拥有可用于预期运行的查询类型的相关索引

按月分区意味着您可以利用分区修剪,假设查询涉及正在分区的列

这还意味着不需要修改现有代码来选择或更新存档数据


不过,您必须设置内务管理以添加新分区,除非您选择间隔分区,但它有自己的一组陷阱。

谢谢@Boneist。分区将基于日期列。来自应用程序的大多数查询将不基于日期列。我无法获得有关如何选择分区的足够信息。你能解释一下吗?例如,我根据表中一列的位置代码查询数据库,分区是基于列上创建的。如何解析特定位置代码的表?。它会从最新的分区一直解析到最旧的分区吗?如果location\u code列上没有索引,并且没有任何其他谓词能够进行分区修剪,那么数据库除了进行完整表扫描之外别无选择。您需要研究分区,特别是全局分区索引和局部分区索引,查看您希望对表运行的查询类型,然后确定需要添加的最佳不确定性。谢谢@boneist。我将进一步研究分区索引。看来这就是我的结局。