我正在为我的应用程序构建一个数据库存储,该应用程序包含一个具有巨大数据量(数亿条记录)的表。我计划在日期字段上建立一个索引,因为我将不时在给定时间段内对所有记录进行批量恢复(例如,在第二天午夜检索所有记录)。
由于记录的数量很大并且性能是这个系统中的一个重要问题,我想知道是否有一种方法可以动态地对我的表进行分区,以便我可以更快地检索记录,创建和截断分区,因为它们没有更需要。例如,在处理完今天的记录后,我将如何为第二天创建一个分区并用其余数据填充它?
我正在为我的应用程序构建一个数据库存储,该应用程序包含一个具有巨大数据量(数亿条记录)的表。我计划在日期字段上建立一个索引,因为我将不时在给定时间段内对所有记录进行批量恢复(例如,在第二天午夜检索所有记录)。
由于记录的数量很大并且性能是这个系统中的一个重要问题,我想知道是否有一种方法可以动态地对我的表进行分区,以便我可以更快地检索记录,创建和截断分区,因为它们没有更需要。例如,在处理完今天的记录后,我将如何为第二天创建一个分区并用其余数据填充它?
在 11g 中我们可以定义 INTERVAL 分区,当 Oracle 获得键不适合任何现有范围的新记录时,它将自动创建新分区。这是一个非常酷的功能。 了解更多。
要记住的一件事是,分区是企业版许可证之上的一项额外收费。所以使用起来并不便宜。
您可以通过使用动态 SQL自动执行创建或截断分区的过程。您可以使用EXECUTE IMMEDIATE编写过程,或者使用orDBMS_SQL
来安排它们(是 10g 的功能,比) 更通用。DBMS_JOB
DBMS_SCHEDULER
DBMS_SCHEDULER
DBMS_JOB
当您对 DDL 有信心时,您可能希望先手动构建分区语句,然后再自动执行该过程。您将在ALTER TABLE 语句的文档中找到所有合成器。
有一种产品可以自动处理它。PartitionManager for Oracle 提供基于组织保留的自动分区管理,包括清除和归档旧数据、统计副本等。您可以在http://www.xyrosoft.com试用
这是我想出的使用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;