Oracle DB每日分区

时间:2013-08-08 05:53:08

标签: oracle database-partitioning

我有下表

  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 个答案:

答案 0 :(得分:2)

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

对于步骤1& 2,你有几个选择

  1. 将数据直接加载到每日分区。
  2. 将数据加载到新分区并将其合并到每日分区中。
  3. 每小时和维护期间将数据加载到新分区 窗口将所有每小时分区合并到每日分区中。
  4. 适合您的方式取决于您的需求。是否立即查询新添加的数据?以什么方式?你会在几个小时(或负载......)中查询数据吗?你在展示聚合吗?您是否对数据执行DML操作(分区上的DDL操作会导致大量锁定)。

    大约3,再次 - 手动。丢弃旧分区。

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

答案 1 :(得分:2)

这是一个如何在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'的分区中。 / p>

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

SELECT * FROM user_tab_partitions WHERE table_name = 'XXX';

之后,如果要删除某些分区,请使用以下命令:

ALTER TABLE XXX DROP PARTITION AAAAAA UPDATE GLOBAL INDEXES

AAAAAA'是分区名称。

我希望它会对你有所帮助!

答案 2 :(得分: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负责。 如果要删除分区,则必须为其编写单独的作业。