分区索引在分区表上(普通表没有local索引)才有lacal索引和global索引类别, user_part_indexes有locality字段区分是local索引还是global索引,而user_indexes没有这样的字段,分区表上建立的索引带了global关键字但是没有分区信息也不是global索引。
分区索引在普通表上只能有global索引
local索引只能创建在分区表上,并且创建local索引的语法不能带分区信息,只带一个local就可以了,并且其分区形式与分区表的分区形式一致(比如分区表的分区表空间是1、2,而分区索引的分区表空间也是1、2)
local索引是对单个分区的,每个分区索引只指向一个表分区。某个分区做truncate或者move,shrink等只影响这个分区的索引。
global索引可以建立在分区表上也可以建立在非分区表上,创建global索引时如果带分区信息,则一定要加global(在分区表和非分区表都如此),并且其分区形式与索引所在表的分区形式没有关联关系。(比如分区表的分区表空间是1、2,而分区索引的分区表空间是1、2、3、4)
global索引则一个分区索引能指向n个表分区,同时,一个表分区,也可能指向n个索引分区,对分区表中的某个分区做truncate或者move,shrink等,可能会影响到n个全局索引分区,正因为这点对于全局分区索引,即使只动,截断一个分区中的数据,都需要rebulid若干个分区甚至是整个索引。
alter\move\truncate table XX update global indexes,这样就会自动维护global索引了
普通索引
分区表和非分区表都可以建立普通索引,建立普通索引(不带分区信息)时带一个global关键字并不代表任何意义,虽然也不报错
分区表
可以创建普通索引,分区local索引,分区global索引
非分区表
可以创建普通索引,分区global索引
创建好分区表后,分区字段的属性不能修改的,否则会报错ORA-14060: 不能更改表分区列的数据类型或长度
Oracle 11g中推出的Interval特性,是针对Range类型分区的一种功能拓展,Interval支持的Range分区键类型只有number、date、timestamp三种类型。其他类型字段做alter table tablename set INTERVAL()时会报错ORA-14751: 间隔分区表的分区列的数据类型无效
原来分区名字为patddd_1\patddd_k 这样的,后来自动分区,则后面的分区名字它怎么处理
dba_tab_partitions.partition_name ---后面的分区名字是自动的,以sys_开头
dba_tab_partitions.partition_position ---后面的position是顺序的,如3、4、5...
但是不是说先出现的分区名字(sys_开头的)对应的position就大于后出现的分区名字对应的position
--开始插入29,分区是sys_p64,当时sys_p64的position是5,后来插入24后(24对应分区sys_p65),sys_p64的position变成了6
CREATE TABLE tablename (hid number,hdate date)
PARTITION BY RANGE(hdate) INTERVAL (NUMTODSINTERVAL(1, 'DAY'))
( PARTITION p01 VALUES LESS THAN (to_date('2003-1-1','yyyy-mm-dd')));
DATE类型:建立的分区表说明2003-1-1之前的数据放入P01分区中,之后的数据每天一个分区
CREATE TABLE tablename (hid number,hdate date)
PARTITION BY RANGE(hid) INTERVAL (100)
( PARTITION p01 VALUES LESS THAN (100));
number类型:建立的分区表说明100之前的数据放入P01分区中,之后的数据每100放入一个新一个分区,比如102放入一个分区p02,203放入一个分区p03
如果只有100以内的数据,还没有大于100的数据,直接插入1111则一样自动建立一个分区,USER_TAB_PARTITIONS.HIGHVALUE显示为1200,再插入103一样会自动建立一个分区,USER_TAB_PARTITIONS.HIGHVALUE显示为200
当如如果建表的时候没有指定interval
修改每100为单位分区则可以手工修改如下
alter table tablename set INTERVAL (100);
修改每天分区则可以手工修改如下alter table tablename set INTERVAL (NUMTODSINTERVAL(1, 'DAY'));
修改为每周分区则如下
alter table tablename set INTERVAL(numtodsinterval(7,'day'));
修改为每月分区则如下
alter table tablename set INTERVAL(numtoyminterval(1,'MONTH'));
修改为每年分区则如下
alter table tablename set INTERVAL(numtoyminterval(1,'YERA'));
numtodsinterval(<x>,<c>) ,x是一个数字,c是一个字符串,c只能是'DAY'、'HOUR'、'MINUTE'、'SECOND'
numtoyminterval(<x>,<c>) ,x是一个数字,c是一个字符串,c只能是'YEAR'、'MONTH'
创建分区表,按范围分区,4个分区信息对于2个表空间
CREATE TABLE range_example02 (
hid number,
hname varchar2(20)
)
PARTITION BY RANGE(hid)
(
PARTITION p01 VALUES LESS THAN(100) TABLESPACE test_space01,
PARTITION p02 VALUES LESS THAN(200) TABLESPACE test_space02,
PARTITION p03 VALUES LESS THAN(300) TABLESPACE test_space01,
PARTITION p04 VALUES LESS THAN (MAXVALUE) TABLESPACE test_space02
);
对上表创建local分区索引(创建后发现索引按表的形式自动分为4个区,对应2个表空间,如果下面语句建立在非分区表上会报错ORA-14016: 必须对 LOCAL 分区索引的基本表进行分区)
create index index_02 on range_example02(hid) local;
对上表创建global分区索引(创建后发现索引分为4个区,对应4个表空间)
create index tt_01 on RANGE_EXAMPLE02(hid) global
partition by range(hid)(
partition i_p1 values less than (1000) tablespace test_space01,
partition i_p2 values less than (2000) tablespace test_space02,
partition i_p3 values less than (3000) tablespace test_space03,
partition i_p4 values less than (maxvalue) tablespace test_space04);
如下两种语句会报错
第一种说明local索引会自动按表分区来创建分区索引,所以创建local索引时不能再带有分区信息
第二种说明global索引创建分区索引必须带有global关键字
create index tt_01 on RANGE_EXAMPLE02(hid) local
partition by range(hid)(
partition i_p1 values less than (1000) tablespace test_space01,
partition i_p2 values less than (2000) tablespace test_space02,
partition i_p3 values less than (3000) tablespace test_space03,
partition i_p4 values less than (maxvalue) tablespace test_space04);
create index tt_01 on RANGE_EXAMPLE02(hid)
partition by range(hid)(
partition i_p1 values less than (1000) tablespace test_space01,
partition i_p2 values less than (2000) tablespace test_space02,
partition i_p3 values less than (3000) tablespace test_space03,
partition i_p4 values less than (maxvalue) tablespace test_space04);
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2120096/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30126024/viewspace-2120096/