我有一个应用程序记录表中的活动(Oracle 10g)。记录记录应至少保存30天。我预计每个月会有大约2000万行添加到此表中。
DBA建议将表拆分为包含一周数据的分区。然后,每周维护脚本将删除最旧的分区(表中只剩下4周的数据)。
分区此日志记录表的最佳方法是什么?
答案 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
您的分区列是表格中感兴趣的日期列。
补充意见:
答案 1 :(得分:1)
最有可能的分区方案是创建日期的range-partition数据。每周您都会创建一个新分区并删除最旧的分区。影响将取决于该表的使用/索引方式。
由于它是一个日志表,也许它没有被索引,在这种情况下,删除一个分区几乎没有影响:引用对象不会失效,drop只需要一个分区锁(并且最旧的分区不应该'那时候插入。)
如果表已编入索引,则必须确定索引是全局索引还是已分区。删除分区时必须重建全局索引(这需要时间,尽管仍然可以管理20M行)。您可以使用UPDATE GLOBAL INDEXES
子句在分区删除后保持索引有效。
本地索引将像表一样进行分区,并且效率可能低于全局索引(如果不按日期查询,索引范围扫描将必须扫描每个本地索引而不是公共索引)。分区删除后,不必更新这些索引。
答案 2 :(得分:0)
每月2000万行,您只需要保留30天的数据? (这大约需要几个月的时间)。
即使有12个月的数据,也不难用正确的索引查询这个表(作为一个大表)。 无论是在日志记录表中有一行还是2000万,插入都没有问题。
在Oracle中进行分区也是一项需要付费的功能,如果我是正确的,那么它也很昂贵(如果你还没有许可证)。