9

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

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

4

4 回答 4

11

在 11g 中我们可以定义 INTERVAL 分区,当 Oracle 获得键不适合任何现有范围的新记录时,它将自动创建新分区。这是一个非常酷的功能。 了解更多

要记住的一件事是,分区是企业版许可证之上的一项额外收费。所以使用起来并不便宜。

于 2010-02-03T14:01:08.733 回答
3

您可以通过使用动态 SQL自动执行创建或截断分区的过程。您可以使用EXECUTE IMMEDIATE编写过程,或者使用orDBMS_SQL来安排它们(是 10g 的功能,比) 更通用。DBMS_JOBDBMS_SCHEDULERDBMS_SCHEDULERDBMS_JOB

当您对 DDL 有信心时,您可能希望先手动构建分区语句,然后再自动执行该过程。您将在ALTER TABLE 语句的文档中找到所有合成器。

于 2010-02-03T13:29:46.093 回答
1

有一种产品可以自动处理它。PartitionManager for Oracle 提供基于组织保留的自动分区管理,包括清除和归档旧数据、统计副本等。您可以在http://www.xyrosoft.com试用

于 2013-09-08T08:45:44.733 回答
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;
于 2011-01-05T21:07:07.793 回答