我有一个包含数据的大表,我需要根据以下要求对表进行分区。
每个id每隔半小时就会插入一次记录。我们有大约5000个id。
我有一个id(数据类型为数字)和row_crt_dtm(数据类型为日期)列,我总是希望拥有最新记录。
例如,如果我有id 1,2和id 1,则最新日期是本月,对于id 2,最新日期是上个月,那么我应该将这些记录放在一个分区中
我试图通过使用rank函数创建一个虚拟列分区但是得到了以下错误
ORA-30483-窗口函数-ARE-不被允许-这里
如何对表进行分区以在一个分区中包含最新记录。
我正在使用oracle 11g。
由于
答案 0 :(得分:1)
我会按ID进行分区,然后按日期进行子分区。然后,您将始终拥有分区中给定ID的最新数据(该ID的最新子分区),但您不会拥有同一分区中所有ID的最新值。您可以轻松删除旧的子分区。
如果您确实必须拥有同一分区中的所有最新记录,则可以手动按日期进行分区,并拥有一个检查最新分区的作业。当作业发现所有ID都有多个值时,它可以计算截止日期并拆分活动分区。这可以作为一个在线操作来完成,但即便如此,也可能会出现这种情况。如果你停止获取id的数据会发生什么?不过,我看不到更好的方法。也许它适合你的账单?
答案 1 :(得分:0)
作为对你的要求的回应你可以做这样的事情:
将旗帜作为最新ID。 有它的date_time。 创建两个分区:一个带有标志Y,另一个带有标志N. 为这些分区启用行移动。
当您需要插入ID时,您有两个选择:
一种是将当前最新id的标志更新为N,然后插入带有标志Y的新行(所有这些都在一个事务中:更新,插入,然后提交),
另一个是在插入新行时有一个触发器来透明地更新现有的最新行(但是这个带触发器的想法更复杂,没有那么快,因为你会得到一个需要处理的变异表错误一种特殊的结构 - 一个包含所有ID的集合......你可以在这里找到示例。