Partition(分区)一直是Oracle数据库引以为傲的一项技术,正是分区的存在让Oracle高效的处理海量数据成为可能,在即将发布的Oracle 11g中,分区技术在易用性和可扩展性上再次得到了增强。
1. Interval Partitioning
在我曾经的一个项目中,由于数据量的巨大,所以表设计为每一个小时一个分区,数据库管理员日常要做的一件重复而无聊的工作就是每隔一天要生成新的24个分区,用以存储第二天的数据。
而在11g中这项工作可以交由Oracle自动完成了,基于Range和List的Interval Partitioning分区类型登场。
PARTITION BY RANGE (time_col)
INTERVAL(NUMTOYMINTERVAL(1, ‘month’))
(PARTITION P0 VALUES LESS THAN (TO_DATE(‘1-1-2007’, ‘dd-mm-yyyy’)));
指定需要Oracle自动创建分区的间隔时间,上面这个例子是1个月,然后至少创建一个基本分区,上面这个例子是在2007-1-1之前的所有数据都在P0分区中,以后每个月的数据都会存放在Oracle自动创建的一个新分区中。
目前还没有更多的资料显示Oracle如何控制每个新分区的属性,比如存放在哪个表空间中,自动创建的数据文件有多大,如果是数据文件是裸设备如何处理,当第一条跨分区的记录插入时实时创建分区效率如何,虽然这些仍然是未知数,但是我们不得不承认这是一个人性化的进步。
2. System Partitioning
又一个人性化的分区类型,系统分区,在这个新的类型中,我们不需要指定任何分区键,数据会进入哪个分区完全由应用程序决定,实际上也就是由SQL来决定,终于,我们在Insert语句中可以指定插入哪个分区了。
假设我们创建了下面这张分区表,注意,没有指定任何分区键:
PARTITION BY SYSTEM
(
PARTITION p1 TABLESPACE tbs_1,
PARTITION p2 TABLESPACE tbs_2,
PARTITION p3 TABLESPACE tbs_3,
PARTITION p4 TABLESPACE tbs_4
);
现在由SQL语句来指定插入哪个分区:
— 数据插入p1分区
INSERT INTO systab PARTITION (p1) VALUES (4,5);
— 为了实现绑定变量,用pno变量来代替实际分区名,以避免过度解析,physical_partid为分区的data_object_id
INSERT INTO systab PARTITION (DATAOBJ_TO_PARTITION (base_table, :physical_partid)) VALUES (…);
由于System Partitioning的特殊性,所以很明显,这种类型的分区将不支持Partition Split操作,也不支持create table as select操作。
3. More Composite Partitioning
在10g中,我们知道复合分区只支持Range-List和Range-Hash,而在在11g中复合分区的类型大大增加,现在Range,List,Interval都可以作为Top level分区,而Second level则可以是Range,List,Hash,也就是在11g中可以有3*3=9种复合分区,满足更多的业务需求。
4. Virtual Column-Based Partitioning
Virtual Column是11g中的一个新功能,这种列中的数据并不实际存储于磁盘上(我们可以看成是一个类似Function的列),只有当读取的时候才实时计算。暂时不讨论性能问题,这个功能还是比较有意思的。
可以通过这样的语句来创建虚拟列。
(col_1 number(6) not null,
col_2 number not null,
…
col_v as (col_1 +col_2);
虚拟列虽然没有实际的存储空间,但是却可以跟其他普通列一样,创建索引,作为分区键,甚至可以收集统计信息,这是让人感觉有意思的地方,一个实时计算的Function如何创建索引呢?等到11g推出的时候就真相大白了。
下一篇介绍RMAN的增强。
Oracle说不定已经开始搞12g了那,
我觉得到12版本应该换个后缀了,估计再是什么什么g的就没新意了
啥时候可以下载测试呢,11号发布了是不是就可以从官方网占下了,期待
—测试无法通过,请指点—-
SQL> CREATE TABLE sys_p_tab (c1 integer, c2 integer)
2 PARTITION BY SYSTEM
3 (
4 PARTITION p1 TABLESPACE users,
5 PARTITION p2 TABLESPACE users,
6 PARTITION p3 TABLESPACE users,
7 PARTITION p4 TABLESPACE users
8 );
表已创建。
SQL> INSERT INTO sys_p_tab PARTITION (p1) VALUES (4,5);
已创建 1 行。
SQL> INSERT INTO sys_p_tab PARTITION (2) VALUES (7,8);
INSERT INTO sys_p_tab PARTITION (2) VALUES (7,8)
*
第 1 行出现错误:
ORA-14108: 非法的分区扩展表名语法
SQL> select * from v$version;
BANNER
——————————————————————————-
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 – Production
PL/SQL Release 11.1.0.6.0 – Production
CORE 11.1.0.6.0 Production
TNS for 32-bit Windows: Version 11.1.0.6.0 – Production
NLSRTL Version 11.1.0.6.0 – Production
SQL>
@yxyup
已经更新了文章,直接写partition index不再被支持,现在需要写partition data_object_id