怎么样在线创建索引或者重构索引

重新创建(create)索引的主要原因是因为新的业务的发展的需要,而重组索引往往是因为索引的偏移膨胀或者是数据删除引起的稀疏状态,也就是有些人说的“碎片”,这个情况下,我们就可以在线重组索引(rebuild online)。

当然,如果需要创建的索引或者需要重组的索引很小,创建与重组过程在几秒之内,这些都可以直接做而不需要讨论。实际情况是,业务很繁重以及表与索引都很大。这些情况下我们需要注意些什么呢?

1、创建新索引

首先,评估该索引的需要程度,如果不是特别紧急的大索引,最好在维护时间操作,还要评估该索引是否会对现有的语句造成负面影响,如导致以前的语句错误的走到这个新索引上(在日期打头的索引上,很容易出现这样的问题)。

然后,根据索引大小以及需要在上面创建的表业务 是否繁忙,如果业务繁忙,尽量选择业务不繁忙的时间,系统负载不高的情况下做,避免额外的消耗,如凌晨2点-6点进行操作。创建索引之前评估索引的大小以 及索引所在表空间剩余空间的大小,除此之外,还要评估临时表空间大小是否足够,用于创建索引时的排序操作。

最后,确定要创建以后,可以采用online模式创建,并且在创建的时候马上分析。

  1. SQL>create index index_name on table_name (field1,field2) tablespace tbs_name online [compute statistics];

创建完成以后,还要马上检查系统应用,如果发现有错误走到该索引的语句,并且有严重影响的,可能需要立即删除该索引或者约束。

  1. SQL>alter table table_name drop constraint constraint_name cascade;
  2. SQL>drop index index_name;

在一些情况下,需要改造一个索引,如添加一个字段到索引或者从索引中删除一个字段,这个时候也需要重新创建索引,但是需要严格按照如下顺序来操作

a、创建新的替代索引(如加字段或者减字段后的索引)

b、测试新的索引没有任何问题

c、删除原来的索引

2、重组索引

如果索引因为更新太频繁或者是删除数据过多,可能引起索引的数据稀疏分布,造成大量的空间浪费,并且严重影响索引的扫描速度。这样的情况下,我们需要对该索引进行空间重组。

重组之前,因为重组索引的时候,先并不删除以前的索引,同样需要确认重组以后的索引所在的表空间是否有足够的空间,以及是否有足够的临时表空间用于排序。同样,如果索引很大,而且使用比较频繁,请确认在业务不繁忙的时候操作。

  1. SQL>alter index index_name rebuild [tablespace tbs_index2] online [compute statistics];

3、快速创建/重组

有的时候,索引实在太大,如几十个G的索引,创建一次或者重组一次需要耗费很长的时间,如果硬件条件许可,我们可以采用一些特殊的方法来提高速度,如采用大的排序区,并行操作等等。

  1. SQL>alter session set sworkarea_size_policy=manaul;
  2. SQL>alter session set sort_area_size=1073741824;
  3. SQL>alter session set sort_area_retained_size=1073741824;
  4. SQL>alter session set db_file_multiblock_read_count=128;
  5. --parallel 2
  6. SQL>alter index index_name rebuild online parallel 2 compute statistics;

然后,特别需要注意的是,在并行创建或者重组完成以后,一定要取消索引的并行度,否则,在OLTP环境中,可能会因为意外的使用并行而出现严重性能问题。

  1. SQL>alter index index_name noparallel;
posted on 2008-06-11 16:12  一江水  阅读(1982)  评论(0编辑  收藏  举报