Oracle DB每日分区

use*_*118 5 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 
   ) ;
Run Code Online (Sandbox Code Playgroud)
  1. 每小时数据将使用sql loader加载到表中.
  2. 我想创建分区,以便每天的数据进入分区.
  3. 在表格中我想存储数据30天.因此,当它超过30天时,最旧的分区应该被删除.

您能否分享一下我如何设计分区的想法?

Mic*_*hal 6

这是一个如何在 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;
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT * FROM user_tab_partitions WHERE table_name = 'XXX';
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE XXX DROP PARTITION AAAAAA UPDATE GLOBAL INDEXES
Run Code Online (Sandbox Code Playgroud)

其中“AAAAAA”是分区名称。

我希望它能帮助你!


hak*_*aki 2

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

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

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

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

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

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