oracle表分区在一个分区中拥有最新记录

问题描述 投票:1回答:2

我有一个庞大的数据表,我需要根据以下要求对表进行分区。

每个id每半小时就会插入一次记录。我们有大约5000个id。

我有一个id(数据类型为数字)和row_crt_dtm(数据类型为日期)列,我总是想拥有最新的记录。

例如,如果我有id的1,2和id 1,最新的日期是这个月,对于id 2,最新的日期是上个月,那么我应该在一个分区中有这些记录

我试图通过排名函数创建一个虚拟列分区,但得到了以下错误

ORA-30483-窗口功能 - 是 - 不是允许的,在这里

如何对表进行分区以在一个分区中包含最新记录。

我正在使用oracle 11g。

谢谢

oracle oracle11g partitioning rank virtual-column
2个回答
1
投票

我会按ID进行分区,然后按日期进行子分区。然后,您将始终拥有分区中给定ID的最新数据(该ID的最新子分区),但您不会拥有同一分区中所有ID的最新值。您可以轻松删除旧的子分区。

如果您确实必须拥有同一分区中的所有最新记录,则可以手动按日期进行分区,并拥有一个检查最新分区的作业。当作业发现所有ID都有多个值时,它可以计算截止日期并拆分活动分区。这可以作为一个在线操作来完成,但即便如此,也可能会出现这种情况。如果你停止获取id的数据会发生什么?不过,我看不到更好的方法。也许它适合您的账单?


0
投票

作为对你的要求的回应你可以做这样的事情:

有一个标志作为最新的ID。有它的date_time。创建两个分区:一个带有标志Y,另一个带有标志N.为这些分区启用行移动。

当您需要插入ID时,您有两个选择:

一种是将标志更新为N以获取当前最新的id,然后插入带有标志Y的新行(所有这些都在一个事务中:更新,插入,然后提交),

另一个是在插入新行时有一个触发器透明地更新现有的最新行(但是这个带触发器的想法更复杂,没那么快,因为你会得到一个变异表错误,需要用特殊的处理建筑 - 一个包含所有ID的集合......你可以在这里找到SO的例子。

© www.soinside.com 2019 - 2024. All rights reserved.