怎么样在线创建索引或者重构索引
当然,如果需要创建的索引或者需要重组的索引很小,创建与重组过程在几秒之内,这些都可以直接做而不需要讨论。实际情况是,业务很繁重以及表与索引都很大。这些情况下我们需要注意些什么呢?
1、创建新索引
首先,评估该索引的需要程度,如果不是特别紧急的大索引,最好在维护时间操作,还要评估该索引是否会对现有的语句造成负面影响,如导致以前的语句错误的走到这个新索引上(在日期打头的索引上,很容易出现这样的问题)。
然后,根据索引大小以及需要在上面创建的表业务 是否繁忙,如果业务繁忙,尽量选择业务不繁忙的时间,系统负载不高的情况下做,避免额外的消耗,如凌晨2点-6点进行操作。创建索引之前评估索引的大小以 及索引所在表空间剩余空间的大小,除此之外,还要评估临时表空间大小是否足够,用于创建索引时的排序操作。
最后,确定要创建以后,可以采用online模式创建,并且在创建的时候马上分析。
- SQL>create index index_name on table_name (field1,field2) tablespace tbs_name online [compute statistics];
创建完成以后,还要马上检查系统应用,如果发现有错误走到该索引的语句,并且有严重影响的,可能需要立即删除该索引或者约束。
- SQL>alter table table_name drop constraint constraint_name cascade;
- SQL>drop index index_name;
在一些情况下,需要改造一个索引,如添加一个字段到索引或者从索引中删除一个字段,这个时候也需要重新创建索引,但是需要严格按照如下顺序来操作
a、创建新的替代索引(如加字段或者减字段后的索引)
b、测试新的索引没有任何问题
c、删除原来的索引
2、重组索引
如果索引因为更新太频繁或者是删除数据过多,可能引起索引的数据稀疏分布,造成大量的空间浪费,并且严重影响索引的扫描速度。这样的情况下,我们需要对该索引进行空间重组。
重组之前,因为重组索引的时候,先并不删除以前的索引,同样需要确认重组以后的索引所在的表空间是否有足够的空间,以及是否有足够的临时表空间用于排序。同样,如果索引很大,而且使用比较频繁,请确认在业务不繁忙的时候操作。
- SQL>alter index index_name rebuild [tablespace tbs_index2] online [compute statistics];
3、快速创建/重组
有的时候,索引实在太大,如几十个G的索引,创建一次或者重组一次需要耗费很长的时间,如果硬件条件许可,我们可以采用一些特殊的方法来提高速度,如采用大的排序区,并行操作等等。
- SQL>alter session set sworkarea_size_policy=manaul;
- SQL>alter session set sort_area_size=1073741824;
- SQL>alter session set sort_area_retained_size=1073741824;
- SQL>alter session set db_file_multiblock_read_count=128;
- --parallel 2
- SQL>alter index index_name rebuild online parallel 2 compute statistics;
然后,特别需要注意的是,在并行创建或者重组完成以后,一定要取消索引的并行度,否则,在OLTP环境中,可能会因为意外的使用并行而出现严重性能问题。
- SQL>alter index index_name noparallel;