6

我有下表

  CREATE TABLE "METRIC_VALUE_RAW" 
   (    
    "SUBELEMENT_ID" INTEGER NOT NULL , 
    "METRIC_METADATA_ID" INTEGER NOT NULL , 
    "METRIC_VALUE_INT" INTEGER, 
    "METRIC_VALUE_FLOAT" FLOAT(126), 
    "TIME_STAMP" TIMESTAMP  NOT NULL 
   ) ;
  1. 每小时数据将使用 sql loader 加载到表中。
  2. 我想创建分区,以便每天的数据进入一个分区。
  3. 在表中,我想将数据存储 30 天。所以当它超过 30 天时,最旧的分区应该被删除。

你能分享你对我如何设计分区的想法吗?

4

3 回答 3

5

这是一个如何在 Oracle 11g 上执行此操作的示例,并且效果很好。我在Oracle 10g上没试过,你可以试试。

这就是方法,如何创建具有每日分区的表:

CREATE TABLE XXX (
    partition_date   DATE,
  ...,
  ...,
)
PARTITION BY RANGE (partition_date)
INTERVAL (NUMTODSINTERVAL(1, 'day'))
(
   PARTITION part_01 values LESS THAN (TO_DATE('2000-01-01','YYYY-MM-DD'))
)
TABLESPACE  MY_TABLESPACE
NOLOGGING;

正如您在上面看到的,Oracle 将在 2000 年 1 月 1 日之后自动为每个不同的 partition_day 创建单独的分区。partition_date 早于该日期的记录将存储在名为“part_01”的分区中。

您可以使用以下语句监视表分区:

SELECT * FROM user_tab_partitions WHERE table_name = 'XXX';

之后,当您想删除某些分区时,请使用以下命令:

ALTER TABLE XXX DROP PARTITION AAAAAA UPDATE GLOBAL INDEXES

其中“AAAAAA”是分区名称。

我希望它会帮助你!

于 2014-09-12T13:47:19.133 回答
2

正如我所说,10g 和 11g 之间的分区自动化存在很大差异。在 10G 中,您将不得不在 ETL 过程中手动管理分区(我确信每个 10g DBA 都有他编写的用于管理分区的实用程序包……)。

对于第 1 步和第 2 步,您有多种选择

  1. 将数据直接加载到日常分区中。
  2. 将数据加载到新分区并将其合并到日常分区中。
  3. 每小时将数据加载到一个新分区中,并在维护窗口期间将所有每小时分区合并为每日分区。

适合您的方式取决于您的需求。新添加的数据是否立即被查询?以什么方式?您会跨几个小时(或加载...)查询数据吗?你在显示聚合吗?您是否对数据执行 DML 操作(分区上的 DDL 操作会导致大量锁定)。

大约 3,再次 - 手动。删除旧分区。

在 11G 中,您拥有新的间隔分区功能,可以自动执行上述一些任务。

于 2013-08-08T06:56:46.373 回答
0

以下是一个示例创建表 sql 到 parititon 数据:

CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL,
    report_status VARCHAR(20) NOT NULL,
    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (
    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-02 00:00:00') ),
    PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-03 00:00:00') ),
    PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-04 00:00:00') ),
    PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-05 00:00:00') ),
    PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-06 00:00:00') ),
    PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-07 00:00:00') ),
    PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-08 00:00:00') ),
    PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-09 00:00:00') ),
    PARTITION p9 VALUES LESS THAN (MAXVALUE)
);

分区将由 DBa 创建,其余部分将由 oracle 负责。如果要删除分区,则必须为其编写单独的作业。

于 2013-08-08T08:57:39.137 回答