分区索引和全局索引:
分区索引就是在所有每个区上单独创建索引,它能自动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使用,也就是索引不会失效,维护起来比较方便,但是在查询性能稍微有点影响。
create index idx_ta_c2 on ta(c2) local (partition p1,partition p2,partition p3,partition p4);
或者 create index idx_ta_c2 on ta(c2) local ;
另外在create unique index idx_ta_c2 on ta(c2) local ;系统会报ORA-14039错误,这是因为ta表的分区列是c1,oracle不支持在分区表上创建PK主键或时主键列不包含分区列,创建唯一约束也不可以这样。
全局索引就是在全表上创建索引,它可以创建自己的分区,可以和分区表的分区不一样,也就是它是独立的索引。
在drop或truncate某个分区时需要创建索引alter index idx_xx rebuild,也可以通过alter table table_name drop partition partition_name update global indexes;实现,但是如果数据量很大则要花很长时间在重建索引上。
可以通过查询user_indexes、user_part_indexes和user_ind_partitions视图来查看索引是否有效。
create index idx_ta_c3 on ta(c3);
或者把全局索引分成多个区(注意和分区表的分区不一样):
create index idx_ta_c4 on ta(c4) global partition by range(c4)(partition ip1 values less than(10000),partition ip2 values less than(20000),partition ip3 values less than(maxvalue));
注意全局索引上的引导列要和range后列一致,否则会有ORA-14038错误。如不能这样写:create index idx_ta_c4 on ta(c1) global partition by range(c4)(partition ip1 values less than(10000),partition ip2 values less than(20000),partition ip3 values less than(maxvalue));
oracle会对主键自动创建全局索引
如果想使某个分区索引置为不可用则可以用如下脚本:
alter index idx_tab1 modify partition "ind partition name" unusable
如果想在主键的列上创建分区索引,除非主键包括分区键,还有就是主键建在两个或以上列上,否则不能创建。
在频繁删除表的分区且数据更新比较频繁时为了维护方便要避免使用全局索引。
索引监控:
另外,oracle表上的索引应该都是有用的索引,也就是都能被查询所用。如果某个索引不能被查询使用,则应该删除它,oracle提供了一个很好的监控索引的方法:
启用索引监控的方法如下:
alter index inx_org_id monitoring usage;
启用监控后,我们可以查看v$objec_usage视图。该视图里记录了那些启用了监控的索引信息,其中,index_name字段说明被监控索引的名称;used字段说明在监控的时间段里是否被使用过:select index_name,table_name,monitoring,used from v$object_usage;
INDEX_NAME TABLE_NAME MON USE
----------------------- --------------------- ------------ ---------
INX_ORG_ID RES_ORG YES NO
select count(*) from reg_org where org_id = 43000600;
COUNT(*)
---------------
0
select index_name,table_name,monitoring,used from v$object_usage;
INDEX_NAME TABLE_NAME MON USE
----------------------- --------------------- ------------ ---------
INX_ORG_ID RES_ORG YES YES
当我们发出一句where org_id=43000600的查询语句后,该索引的used的值从NO变成YES了。因为org_id字段上存在一个索引,并且被使用到了。
alter index idx_org_id nomonitoring usage;
关闭索引监控。
索引以及表的分区的相关视图,以及分区的导入导出:
导出子分区:exp test1/test1 tables=ta:p1 file=part_1.dmp
分区管理用到的视图:
user_tab_partitions,
user_part_indexes,
user_part_tables,
user_partial_drop_tabs,
user_part_indexes
user_part_key_columns
========================
查询分区表:select * from hcl partition(p_200809)
导出分区表:exp username/pwd file=/aa.dmp tables=(hcl:p_200809,hcl:p_200810);
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12129601/viewspace-746901/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12129601/viewspace-746901/