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

时间:2018-04-24 10:20:22

标签: oracle oracle11g partitioning rank virtual-column

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

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

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

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

我试图通过使用rank函数创建一个虚拟列分区但是得到了以下错误

ORA-30483-窗口函数-ARE-不被允许-这里

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

我正在使用oracle 11g。

由于

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

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

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