今天对数字电视系统的大表的几个分区进行了维护,总结以下经验也是为了以后能够更好的来维护分区表。
对索引的几种情况分别进行总结:
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
延伸: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]).