在oracle 11.2环境下测试
--drop table tab_a purge;
--创建分区表
createtable tab_a
(
number(19)primarykey,
varchar2(300),
integer
)
partitionbylist(r_pat)
(
partitionvalues(1),
partitionvalues(2),
partitionvalues(3),
partitionvalues(default)
)
;
--创建普遍表
createtableasselect*from;
--创建主键
altertableaddprimarykey(r_id);
---插入测试数据
insertinto tab_a
(r_id,r_name,r_pat)
select,a.OBJECT_NAME,1from;
insertintoselect99199999,'test',1from;
commit;
--测试分区交换
----1.分区表,创建了主键索引,普通表没有创建,则
altertableexchangepartitionwithtableincludingindexeswithoutvalidation
--ORA-14097: ALTER TABLE EXCHANGE PARTITION 中的列类型或大小不匹配
---2.分区表,创建了主键索引,普通表也创建全局索引则
altertableaddprimarykey(r_id);
altertableexchangepartitionwithtableincludingindexeswithoutvalidationupdateglobalindexes;
--ORA-14098: ALTER TABLE EXCHANGE PARTITION 中的表索引不匹配
--3.分区表,创建了主键索引,普通表也创建主键索引则,且不包含索引交换
altertableexchangepartitionwithtable/*including indexes*/withoutvalidation/*update global indexes*/;
--成功---
--但是 insert into tab_a select 99199999,'test',1 from dual;
--ORA-01502: 索引 'SCOTT.SYS_C0012090' 或这类索引的分区处于不可用状态
---这时需要重建索引才能更新数据 ----
alterindexrebuild;
insertintoselect99399999,'test',1from;
---成功,,,
--4.分区表,创建了主键索引,普通表也创建主键索引则,且不包含索引交换,更新全局索引
truncatetable;(/*清理分区不行*/)
insertintoselect99199999,'test',1from;
commit;
altertableexchangepartitionwithtable/*including indexes*/withoutvalidationupdateglobalindexes;
insertintoselect99399999,'test',1from;
---成功,,,
---但是更新普通表数据时,insert into tab_b select 99399999,'test',1 from dual 时,
--ORA-01502: 索引 'SCOTT.SYS_C0012090' 或这类索引的分区处于不可用状态
--------------------------
---5.在分区表的非分区表键上建立全局索引,普通表也建立全局索引
altertabledropprimarykey;
altertabledropprimarykey;
createindexon(r_id);
createindexon(r_id);
altertableexchangepartitionwithtableincludingindexeswithoutvalidation;
-----ORA-14098: ALTER TABLE EXCHANGE PARTITION 中的表索引不匹配
---6.在分区表的非分区表键上建立全局索引,普通表不建立全局索引
dropindex;
altertableexchangepartitionwithtableincludingindexeswithoutvalidation;
---成功
-----7.在分区表的非分区键上建立本地索引,普通表不创建索引
dropindex;
createindexon(r_id)local;
altertableexchangepartitionwithtableincludingindexeswithoutvalidation;
--ORA-14098: ALTER TABLE EXCHANGE PARTITION 中的表索引不匹配
-----8.在分区表的非分区键上建立本地索引,普通表创建索引
createindexon(r_id);
altertableexchangepartitionwithtableincludingindexeswithoutvalidation;
---成功
---9.在分区表的分区键上创建全局索引,普通表创建索引
dropindex;
dropindex;
createindexon(r_pat);
createindexon(r_pat);
altertableexchangepartitionwithtableincludingindexeswithoutvalidation;
--ORA-14098: ALTER TABLE EXCHANGE PARTITION 中的表索引不匹配
---10.在分区表的分区键上创建全局索引,普通表不创建索引
dropindex;
dropindex;
createindexon(r_pat);
altertableexchangepartitionwithtableincludingindexeswithoutvalidation;
---成功
-----11.在分区表的分区键上创建本地索引,普通表不创建索引
dropindex;
createindexon(r_pat)local;
altertableexchangepartitionwithtableincludingindexeswithoutvalidation;
--ORA-14098: ALTER TABLE EXCHANGE PARTITION 中的表索引不匹配
----12.在分区表的分区键上创建本地索引,普通表创建索引
createindexon(r_pat);
altertableexchangepartitionwithtableincludingindexeswithoutvalidation;
---成功
---
---13.在分区表上的分区键和非分区键上创建全局索引,普通表上创建索引
drop indexidx_a_r_id;
dropindexidx_b_r_id;
createindexidx_a_r_idontab_ar_id,r_pat);
createindexidx_b_r_idontab_br_id,r_pat);
altertabletab_aexchangepartitionwithtabletab_bincludingindexeswithoutvalidation;
--报错
---14.在分区表上的分区键和非分区键上创建全局索引,普通表不创建索引
dropindexidx_b_r_id;
altertabletab_aexchangepartitionwithtabletab_bincludingindexeswithoutvalidation;
---成功
--15.在分区表上的分区键和非分区键上创建本地索引,普通表不创建索引
dropindexidx_a_r_id;
createindexidx_a_r_idontab_a(r_id,r_pat)local;
altertabletab_aexchangepartitionwithtabletab_bincludingindexeswithoutvalidation;
---报错
--16.在分区表上的分区键和非分区键上创建本地索引,普通表创建索引
createindexidx_b_r_idontab_b(r_id,r_pat);
altertabletab_aexchangepartitionwithtabletab_bincludingindexeswithoutvalidation;
---成功
---17.在分区表上的分区键和非分区键上创建本地索引a,同时又在非分区键上创全局建索引b,普通表对应字段上都创建索引
dropindexidx_a_r_id;
dropindexidx_b_r_id;
createindexidx_a_r_idontab_a(r_id);
createindexidx_b_r_idontab_b(r_id);
createindexidx_a_r_id_loc ontab_a(r_id,r_pat)local;
createindexidx_b_r_id_loc ontab_b(r_id,r_pat);
altertabletab_aexchangepartitionwithtabletab_bincludingindexeswithoutvalidation;
--报错
---18.在分区表上的分区键和非分区键上创建本地索引a,同时又在非分区键上创建全局索引b,
--在普通表对应的分区表上的本地索引a的字段上创建索引,同时分区表的全局索引对应的字段上不创建索引
dropindexidx_a_r_id;
dropindexidx_b_r_id;
dropindexidx_a_r_id;
dropindexidx_b_r_id;
createindexidx_a_r_idontab_a(r_id);
createindexa_r_id_loc ontab_ar_id,r_pat)local;
createindexidx_b_r_idontab_br_id,r_pat);
altertabletab_aexchangepartitionwithtabletab_bincludingindexeswithoutvalidation;
--成功
----以上创建普通表的索引时,都是跟分区表的字段相对应