Oracle中的动态表分区

时间:2010-02-03 12:22:50

标签: oracle dynamic database-partitioning

我正在为我的应用程序构建数据库存储,该数据库存储包含一个包含大量数据量(数亿条记录)的表。我打算在日期字段上有一个索引,因为我将不时地在给定的时间段内对所有记录进行批量恢复(例如,检索第二天的所有记录,在午夜)。

由于记录数量巨大且性能是此系统中的一个重要问题,我想知道是否有一种方法可以动态分区我的表,以便我可以更快地检索记录,创建和截断分区为他们不再需要了。例如,我如何在第二天创建分区并在处理完今天的记录后用剩余的数据填充它?

4 个答案:

答案 0 :(得分:10)

在11g中,我们可以定义INTERVAL分区,当Oracle获取其密钥不适合任何现有范围的新记录时,Oracle将自动创建新分区。这是一个非常酷的功能。 Find out more

要记住的一件事是,在Enterprise Edition许可证之上,分区是一项收费的额外费用。因此使用它并不便宜。

答案 1 :(得分:3)

您可以使用dynamic SQL自动创建或截断分区的过程。您可以使用EXECUTE IMMEDIATEDBMS_SQL编写程序,然后使用DBMS_JOBDBMS_SCHEDULER安排它们(DBMS_SCHEDULER是一个10g的功能,并且比{DBMS_JOB更通用{1}})。

您可能希望首先手动构建分区语句,并在您对DDL有信心时自动执行该过程。您将在documentation for the ALTER TABLE statement中找到所有的synthax。

答案 2 :(得分:1)

以下是我提出的使用SYSDATE创建分区和偏移量的示例。我必须使用连接到SYSDATE的字符串创建替换参数:

COLUMN temp_var new_value partition_name_01;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 3, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_01;
SELECT TO_CHAR(SYSDATE - 3, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
COLUMN temp_var new_value partition_name_02;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 2, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_02;
SELECT TO_CHAR(SYSDATE - 2, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
COLUMN temp_var new_value partition_name_03;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 1, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_03;
SELECT TO_CHAR(SYSDATE - 1, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
COLUMN temp_var new_value partition_name_04;
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE, 'YYYYMMDD') AS temp_var FROM dual;
COLUMN temp_var new_value partition_date_04;
SELECT TO_CHAR(SYSDATE, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual;
CREATE TABLE TABLE_NAME
(
   SEQ_NO                 NUMBER NOT NULL,
   INSERT_DATE            DATE NOT NULL,
   FIRST_NAME             VARCHAR2 (256 BYTE),
   LAST_NAME              VARCHAR2 (256 BYTE),
   ID_NUM                 NUMBER,
   ID_STATUS              NUMBER
)

PARTITION BY RANGE
   (INSERT_DATE)
   SUBPARTITION BY LIST
      (ID_STATUS)
      SUBPARTITION TEMPLATE (
         SUBPARTITION SP1 VALUES (0) TABLESPACE &tblspce,
         SUBPARTITION SP2 VALUES (1) TABLESPACE &tblspce,
         SUBPARTITION SP3 VALUES (2) TABLESPACE &tblspce)

   (
   PARTITION &partition_name_01
      VALUES LESS THAN
      (TO_DATE ('&partition_date_01',
                   'SYYYY-MM-DD HH24:MI:SS',
                   'NLS_CALENDAR=GREGORIAN')),

   PARTITION &partition_name_02
      VALUES LESS THAN
      (TO_DATE ('&partition_date_02',
                   'SYYYY-MM-DD HH24:MI:SS',
                   'NLS_CALENDAR=GREGORIAN')),

   PARTITION &partition_name_03
      VALUES LESS THAN
      (TO_DATE ('&partition_date_03',
                   'SYYYY-MM-DD HH24:MI:SS',
                   'NLS_CALENDAR=GREGORIAN')),
sysdate

   PARTITION &partition_name_04
      VALUES LESS THAN
      (TO_DATE ('&partition_date_04',
                   'SYYYY-MM-DD HH24:MI:SS',
                   'NLS_CALENDAR=GREGORIAN')))

ENABLE ROW MOVEMENT;

答案 3 :(得分:1)

有一款产品可以自动处理。 PartitionManager for Oracle根据组织保留提供自动分区管理,包括清除和存档旧数据,统计复制等。您可以在http://www.xyrosoft.com

进行试用。