有关Oracle表分区进行(DML)维护后对索引的影响的分析

来源:互联网 发布:搬家软件哪个好 编辑:程序博客网 时间:2024/05/24 05:48

有关Oracle表分区进行(DML)维护后对索引的影响的分析

分类: 数据库 oracle 210人阅读 评论(0)收藏 举报
 对索引的几种情况分别进行总结: 
1、如果删除分区,则会导致该表下所有的索引状态处于不可用状态(除本地前缀索引外); 
2、如果重命名表,同上 
3、如果truncate分区数据,同上; 
4、重命名分区,不会对索引产生任何影响。 
解释: 
对于分区表,索引有以下几种方式: 
1、普通索引,与分区无关,就是平常的索引; 
2、全局分区索引,独立于分区的索引,按照独立的分区方式分区。按照网上介绍的和个人的实践, 
这个方式查询效率不高; 
3、本地前缀分区索引,即基于分区表的字段进行的分区,创建方式很简单,在普通索引建立的语句后面加个local即可, 
    效率相对于普通索引高一点; 
4、本地非前缀分区索引,即非基于分区表的分区字段,除非是特殊情况,这种方式效率较低,不推荐使用。 
当索引处于不可用状态时,数据将不能插入,会提示:ora-01502:state unusuable。 
且这种情下,只要表中有一个索引处于不可用状态,都会使表处于不可插入状态。 
可以修改参数来实现这种情况下的数据插入问题:alter session set skip_unusable_indexes=true; 
但是有种情况除外,当有存在唯一主键索引时,数据依然不能插入。 
而且主键索引也不能drop,因此想通过删除主键索引再修改参数来实现数据的可插入是不可实现的。 
因此这种情况下(索引状态处于不可用状态时)较好的办法是,先删除要进行本地索引分区的索引(此时尚未进行本地分区), 
创建本地分区索引后,再drop表分区,这样的好处是本来drop分区后需要重建n+1个索引, 
现在只要重建n个索引,这样的话就省去了重建这个索引的时间了。 

对于本地分区前缀索引,删除分区只会对所在分区的部分产生影响,对于其他的部分则仍然是正常状态的。 

另:修改参数只能对于当前session所在的用户有效,对于其他session,如果没有设置该条件,数据还是处于不可插入状态的。 

以上情况,需要在实际的应用中充分考虑到这些问题才能最大的减少所带来的数据丢失。 

重命名分区不会对索引状态产生影响。 

注: 
1、如何删除分区 
alter table [table_name] drop partition [partition_name]; 

2、如何删除与创建本地分区索引 
删除:drop index [index_name]; 
创建:create index [index_name] on [table_name]([index_column]) tablespace [tablespace_name] local [nologging/logging]; 
注意: 
当在大表上建立索引时,使用NOLOGGING选项可以最小化重做记录.使用NOLOGGING选项有以下优点. 
节省重做日志空间 
降低索引建立实际 
提高索引并行建立的性能. 
但是nologging参数不建议在部署了dataguard的情况下使用,因为dataguard是基于归档日志来进行远程备份的。 

3、如何重建索引: 
alter index [index_name] rebuild [parallel {number}] [nologging/loggin]; 

4、如何创建分区: 
--范围分区 
create table [table_name] partition by range([col_name])( 
partition [part_name] values less than [range_value] tablespace [tablespace_name], 
... 
) 
--列表分区 
--hash分区 

5、如何截断分区: 
alter table [table_name] truncate partition [partition_name]; 

延伸:truncate一个表或一个分区,能使HWM重至为0,而delete则不能。 

6、如何重命名分区: 
alter table [table_name] rename partition [old_name] to [new_name]; 

7、如何查询索引状态: 
select ind.table_name, ind.index_name, ind.status 
from user_indexes ind 
where ind.index_name = '[index_name]' 
and ind.table_name = '[table_name]' 

8、如何添加分区: 
alter table [table_name] add partition [partition_name] values less than([range_value]). 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝店铺没有人访问怎么办 淘宝店铺没有人问怎么办 淘宝申请退款后店铺关闭怎么办 宝贝详情怎么改不了怎么办 改详情页后被删除宝贝怎么办 淘宝网商贷生意不好还不了怎么办 英国遗失在酒店物品怎么办 班福法则首位是0怎么办 同事能力比你强怎么办 新买的木板床响怎么办 笔记本键盘驱动坏了怎么办 云柜快递超时了怎么办 毕业设计被老师发现抄的怎么办 地板颜色太深了怎么办 皮质鞋子破皮了怎么办 吃了蜘蛛丝会怎么办 南京高二分班不公平怎么办? 高中分班考试没考好怎么办 实木门上的伸缩缝太深怎么办 mac点关机没反应怎么办 被压倒扁的易拉罐怎么办 白色车漏底漆了怎么办 客厅对着卧室门怎么办 老公不上进还懒怎么办 二胡按弦手指分不开怎么办 酷塑做完后疼痛怎么办 冷冻治疗后水泡破了怎么办 冷冻治疗的水泡破了怎么办? 冷冻治疗水泡破了怎么办 脚上冷冻后起泡怎么办 刺猴冷冻后起泡怎么办 隔壁太吵怎么办阴招 楼上有小孩太吵怎么办 捷达小水管睹了怎么办 楼房下水管冻了怎么办 一楼地面很潮湿怎么办 新房子地面有裂缝怎么办 地砖下面的下水管漏水怎么办 速冻饺子冻在一起了怎么办 牛排泡水解冻了怎么办 饺子都粘一起了怎么办