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