对用于记录的Oracle表进行分区

时间:2009-11-09 12:12:04

标签: oracle10g partitioning

我有一个应用程序记录表中的活动(Oracle 10g)。记录记录应至少保存30天。我预计每个月会有大约2000万行添加到此表中。

DBA建议将表拆分为包含一周数据的分区。然后,每周维护脚本将删除最旧的分区(表中只剩下4周的数据)。

分区此日志记录表的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

对表进行分区并不难 - 看起来您将每周删除数据,因此分区子句看起来像

PARTITION "P2009_45"  VALUES LESS THAN 
(TO_DATE(' 2009-11-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
 PARTITION "P2009_46"  VALUES LESS THAN 
(TO_DATE(' 2009-11-09 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
... etc

您的分区列是表格中感兴趣的日期列。

补充意见:

  • 如果你可以升级到11g 利用间隔 分区,类似于 这个范围分区,但Oracle 将管理创建新分区 为你。
  • 如果你要经常下车 分区,我建议制作所有 桌上的索引 本地分区以避免 重建是必要的 分区后的全局分区 操作。
  • 如果您对数字有所了解 每月的日志条目,以及它 你可能保持相对稳定 考虑使用序列(作为主键) 加上这个数字,然后 回收到0.然后你的 日志语句必须变为“合并 INTO ......“也是一种陈述 创建一个新行或覆盖该行 如果它存在这只能保证 你将保留行数 允许的序列最大值和 不是一定的时间间隔,但这个 可能是另一种选择 分区(作为DvE指向 out,是一项额外费用选项)

答案 1 :(得分:1)

最有可能的分区方案是创建日期的range-partition数据。每周您都会创建一个新分区并删除最旧的分区。影响将取决于该表的使用/索引方式。

由于它是一个日志表,也许它没有被索引,在这种情况下,删除一个分区几乎没有影响:引用对象不会失效,drop只需要一个分区锁(并且最旧的分区不应该'那时候插入。)

如果表已编入索引,则必须确定索引是全局索引还是已分区。删除分区时必须重建全局索引(这需要时间,尽管仍然可以管理20M行)。您可以使用UPDATE GLOBAL INDEXES子句在分区删除后保持索引有效。

本地索引将像表一样进行分区,并且效率可能低于全局索引(如果不按日期查询,索引范围扫描将必须扫描每个本地索引而不是公共索引)。分区删除后,不必更新这些索引。

答案 2 :(得分:0)

每月2000万行,您只需要保留30天的数据? (这大约需要几个月的时间)。

即使有12个月的数据,也不难用正确的索引查询这个表(作为一个大表)。 无论是在日志记录表中有一行还是2000万,插入都没有问题。

在Oracle中进行分区也是一项需要付费的功能,如果我是正确的,那么它也很昂贵(如果你还没有许可证)。