1

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

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

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

4

3 回答 3

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。然后您的日志记录语句必须成为“MERGE INTO...”语句,这些语句要么创建新行,要么覆盖该行(如果存在)。这仅保证您将保留序列最大值允许的行数,而不是某个时间间隔,但这可能是分区的替代方案(正如 DvE 指出的那样,这是一个额外费用选项)
于 2009-11-09T15:11:51.673 回答
1

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

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

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

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

于 2009-11-09T15:26:20.703 回答
0

每月有 2000 万行数据,而您只需要保留 30 天的数据?(这大约是一个月的价值)。

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

如果我是正确的,Oracle 中的分区也是一个需要付费的功能,所以它也很昂贵(如果您还没有许可证)。

于 2009-11-09T14:30:42.773 回答