Oracle 分区表索引
来源:互联网 发布:淘宝网玩具战神金刚 编辑:程序博客网 时间:2024/06/08 07:50
一、分区表索引实验
SQL> create table part_tab1 (id int) partition by range (id) ( partition p1 values less than (10), partition p2 values less than (20), partition p3 values less than (maxvalue) ) ;Table createdSQL> insert into part_tab1 select rownum from dual connect by rownum <=50;50 rows insertedSQL> commit;Commit completeSQL> create index idx_id on part_tab1(id) local;Index created查看索引状态,都是有效果的SQL> select index_name,partition_name,status from user_ind_partitions where index_name='IDX_ID';INDEX_NAME PARTITION_NAME STATUS------------------------------ ------------------------------ --------------------------------------------IDX_ID P1 USABLEIDX_ID P2 USABLEIDX_ID P3 USABLE删除分区表分区1SQL> alter table part_tab1 truncate partition p1 ;Table truncatedSQL> select count(*) from part_tab1 partition(p1); COUNT(*)------------------- 0查看索引并没有失效SQL> select index_name,partition_name,status from user_ind_partitions where index_name='IDX_ID';INDEX_NAME PARTITION_NAME STATUS------------------------------ ------------------------------ ------------------------------------------------IDX_ID P1 USABLEIDX_ID P2 USABLEIDX_ID P3 USABLE说明对于局部索引,直接TURNCATE分区是不会影响分区索引的!!!再实验分区交换的情况,步骤如下:SQL> create table normal_tab1(id int);Table createdSQL> insert into normal_tab1 select rownum from dual connect by rownum<10;9 rows insertedSQL> commit;Commit completeSQL> select count(*) from normal_tab1; COUNT(*)---------------------- 9SQL> create index idx_norm on normal_tab1 (id);Index createdSQL> alter table part_tab1 exchange partition p1 with table normal_tab1 including indexes;Table alteredSQL> select count(*) from normal_tab1; COUNT(*)---------------------- 0SQL> select count(*) from part_tab1 partition(p1); COUNT(*)-------------------- 9分区交换成功后,索引仍然有效!SQL> select index_name,partition_name,status from user_ind_partitions where index_name='IDX_ID';INDEX_NAME PARTITION_NAME STATUS------------------------------ ------------------------------ -------------------------------------------------IDX_ID P1 USABLEIDX_ID P2 USABLEIDX_ID P3 USABLE由此也可见分区索引的交换加上关键字including indexes 后索引是生效的。SQL> alter table part_tab1 exchange partition p1 with table normal_tab1 ;Table alteredSQL> select index_name,partition_name,status from user_ind_partitions where index_name='IDX_ID';INDEX_NAME PARTITION_NAME STATUS------------------------------ ------------------------------ ----------------------------------------------------IDX_ID P1 UNUSABLEIDX_ID P2 USABLEIDX_ID P3 USABLE说明如果没有加including indexes进行分区交换,该索引立马失效。甚至导致原来的临时表的索引也失效了,也要重建SQL> select index_name ,status from user_indexes where index_name='IDX_NORM';INDEX_NAME STATUS------------------------------ -------------------------------------IDX_NORM UNUSABLESQL> alter index idx_norm rebuild;Index alteredSQL> alter index idx_id rebuild partition p1;Index altered
总结:局部索引truncate分区不会导致索引失效。但是如果交换分区的时候,交换的临时表没有索引,或者有索引,没有用including indexes的关键字,会导致局部的索引失效。
二、全局索引
SQL> create index idx_id on part_tab1(id);Index createdSQL> select index_name,table_name,status from user_indexes where table_name='PART_TAB1';INDEX_NAME TABLE_NAME STATUS------------------------------ ------------------------------ ---------------------------------------------------------IDX_ID PART_TAB1 VALID发现全局索引和准备置换的索引根本不能匹配,如果想置换索引,分区表必须是LOCAL索引!SQL> alter table part_tab1 exchange partition p1 with table normal_tab1 including indexes;alter table part_tab1 exchange partition p1 with table normal_tab1 including indexesORA-14098: ALTER TABLE EXCHANGE PARTITION 中的表索引不匹配那删除分区全局索引会失效吗,操作如下,发现仍然是有效的!SQL> alter table part_tab1 truncate partition p1 ;Table truncatedSQL> select index_name,table_name,status from user_indexes where table_name='PART_TAB1';INDEX_NAME TABLE_NAME STATUS------------------------------ ------------------------------ ---------------------------------------------------------IDX_ID PART_TAB1 VALID其实有的时候实验出来的结果也要推敲一下,其实删除分区全局索引是会导致索引失效的,只不过刚才TRUNCATE的恰好是一个空分区,所以没有印象,继续操作如下, truncate另一分区就可以知道了SQL> alter table part_tab1 truncate partition p2;Table truncatedSQL> select index_name,table_name,status from user_indexes where table_name='PART_TAB1';INDEX_NAME TABLE_NAME STATUS------------------------------ ------------------------------ ---------------------------------------------------------IDX_ID PART_TAB1 UNUSABLE如果删除掉置换表的索引,可以进行交换吗?QL> drop index idx_norm;Index dropped发现置换成功了!SQL> alter table part_tab1 exchange partition p1 with table normal_tab1 including indexes;Table alteredSQL> select count(*) from part_tab1 partition(p1); COUNT(*)--------------------- 9此时查看索引,发现全局索引也失效了!SQL> select index_name,table_name,status from user_indexes where table_name='PART_TAB1';INDEX_NAME TABLE_NAME STATUS------------------------------ ------------------------------ ---------------------------------------------------------IDX_ID PART_TAB1 UNUSABLE
全局索引如果置换的普通表有索引,置换根本不成功,除非把置换表索引删除,但是一旦这样置换成功,全局索引也就失效了。truncate分区会使全局索引失效,但是如果truncate的分区是空的,那就不会使整个索引失效
本文出自 “无双城” 博客,谢绝转载!
- oracle分区表&索引(例子)
- ORACLE分区表、分区索引
- ORACLE分区表、分区索引
- oracle 分区表,分区索引
- ORACLE分区表、分区索引
- oracle分区表和索引
- Oracle 分区表索引
- ORACLE分区表、分区索引
- ORACLE分区表、分区索引
- 简单ORACLE分区表、分区索引
- 简单ORACLE分区表、分区索引
- oracle分区表、分区索引详解!
- 简单ORACLE分区表、分区索引
- 简单ORACLE分区表、分区索引
- 简单ORACLE分区表、分区索引
- Oracle 分区表和索引操作
- ORACLE分区表、分区索引详解
- Oracle分区表及分区索引
- Oracle 表空间管理和优化
- Oracle 索引维护
- DML并行度限制
- Oracle 临时表
- Oracle 物化视图
- Oracle 分区表索引
- 获得微软MVP称号
- Oracle ora-01555解决方法
- 黑马程序员——IO流
- Oracle 快速Drop大表
- Weblogic 10.3.6 for linux 集群安装
- SQL Server版本信息查询
- 将博客搬至CSDN
- [Qt教程] 第46篇 进阶(六) 国际化