1

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

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

我有一个 id(datatype as number) 和 row_crt_dtm(datatype as date) 列,我总是想拥有最新的记录。

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

我尝试通过使用 rank 函数创建虚拟列分区,但出现以下错误

ora-30483-window-functions-are-not-allowed-here

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

我正在使用 oracle 11g。

谢谢

4

2 回答 2

1

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

如果你真的必须在同一个分区中拥有所有最新记录,你可以手动按日期分区并有一个检查最新分区的作业。当作业发现所有 id 都有多个值时,它可以计算截止日期并拆分活动分区。这可以通过在线操作来完成,但即便如此,也可能会有问题。如果你停下来获取一个 id 的数据会发生什么?不过,我看不到更好的方法。也许它符合您的要求?

于 2018-04-24T17:25:47.150 回答
0

作为对您提出的问题的回应,您可以执行以下操作:

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

当您需要插入 id 时,您有两种选择:

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

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

于 2018-05-03T06:31:57.180 回答