项目中遇到这样的问题,表的结构简单,但数据量很大,且对于表的每一列可能都需要有查询,于是速度很慢,尤其是每当过去一段时间后,数据插入和查找都开始变得困难。
于是想到分区。然而在10g以前,大体只能采取按照范围或散列分区,加入需要在时间列上进行分区,将导致灾难性后果,每天一个分区,手写会要命,需要一个作业新建分区。数据库升级到了11g,发现支持Interval分区,即一个范围分区的增强功能,可以实现equi-sized范围分区的自动化,创建的分区作为元数据,只有最开始的分区是永久分区。随着数据的增加会分配更多的部分,并自动创建新的分区和本地索引。
下面是一些尝试:
1. 通过EM创建表并新建分区。.在分区向导中,可以看到有关Interval分区的选项——有提示说,可以实现自动增加分区,但是同一页面上有一个必填的选项要求指定分区个数,我觉得puzzled,但是没有别的选择。新建之后查看DDL,没有看到关于Interval的描述。尝试插入几条新数据,果然无效。
2. 使用SQL直接新建Interval分区,如下:
然后尝试插入几条数据,成功地分布在了不同的分区。
代码
1 CREATE TABLE "AA"."T_RECORD"
2 ( "RECORD_ID" NUMBER,
3 "RECORD_TIME" DATE NOT NULL ,
4 "RECORD_CONTENT" VARCHAR2(40) NOT NULL ,
5 "RECORD_STYLE" VARCHAR2(10) DEFAULT 'B' NOT NULL ,
6 "RECORD_DOM_FK" NUMBER NOT NULL ,
7 CONSTRAINT
8 "FK_RECORD_DOM" FOREIGN KEY ("RECORD_DOM_FK")
9 REFERENCES "AA"."T_DOM" ("DOM_ID") VALIDATE ,
10 CONSTRAINT
11 "PK_RECORD" PRIMARY KEY ("RECORD_ID") VALIDATE
12 )
13 TABLESPACE "SPACE" PARTITION BY RANGE (RECORD_TIME)
14 INTERVAL (NUMTODSINTERVAL(1, 'DAY'))
15 STORE IN(SPACE)
16 ( PARTITION "T_RACORD_P1" VALUES LESS THAN (TO_DATE('2009-06-01','YYYY-MM-DD'))
17 )
2 ( "RECORD_ID" NUMBER,
3 "RECORD_TIME" DATE NOT NULL ,
4 "RECORD_CONTENT" VARCHAR2(40) NOT NULL ,
5 "RECORD_STYLE" VARCHAR2(10) DEFAULT 'B' NOT NULL ,
6 "RECORD_DOM_FK" NUMBER NOT NULL ,
7 CONSTRAINT
8 "FK_RECORD_DOM" FOREIGN KEY ("RECORD_DOM_FK")
9 REFERENCES "AA"."T_DOM" ("DOM_ID") VALIDATE ,
10 CONSTRAINT
11 "PK_RECORD" PRIMARY KEY ("RECORD_ID") VALIDATE
12 )
13 TABLESPACE "SPACE" PARTITION BY RANGE (RECORD_TIME)
14 INTERVAL (NUMTODSINTERVAL(1, 'DAY'))
15 STORE IN(SPACE)
16 ( PARTITION "T_RACORD_P1" VALUES LESS THAN (TO_DATE('2009-06-01','YYYY-MM-DD'))
17 )
一些尚未验证的问题:
1. 经过这样的以每天为一个分区的形式是否能解决本文开始时所提出的问题,使得效率提高 。
2. 这样的分区在时间长了以后是否会给系统造成较大负担。