提高oracle索引创建速度

      大批量导入数据,我们往往会先取消索引其以提高插入的速度。然后等数据导入完毕后再重新创建索引。在这个过程中如果能够采用一些可选项,则可以缩短索引创建的时间。

可选项一:NOSORT,记录排序可选项

  默认情况下,在表中创建索引的时候,会对表中的记录进行排序,排序成功后再创建索引。但是当记录比较多的是,这个排序作业会占用比较多的时间,这也就增加了索引建立的时间(排序作业是在索引创建作业中完成)。如果表中的数据已经排好序了(按索引字段排序),那么在创建索引时就不需要为此重新排序。采用NOSORT可选项,如果表中的记录已经按顺序排列,那么在重新创建索引的时候,就不会重新排序,可以提高索引创建的时间,节省内存中的排序缓存空间。相反,如果表中的记录是不按索引关键字排序的话,那么此时采用NOSORT关键字的话,系统就会提示错误信息,并拒绝创建索引。

可选项二:NOLOGGING,是否需要记录日志信息
     默认情况下,数据库在在创建索引时,是不采用这个选项的,即会把相关的信息保存到重做日志中去。如果遇到什么意外的话,可以利用重做日志来进行恢复。

     如果数据库已经使用了好几年了。后来因为某种原因需要重建索引。在这种情况下,由于数据库使用过程中很多因素数据库管理员无法控制。此时为这种类型的数据库创建索引时,为了保险起见还是不要采用这个选项好。

可选项三:COMPUTE STATISTICS,是否生成统计信息

  如果管理员在创建索引时采用了这个选项,则数据库将在创建索引的过程中以非常小的代价直接生成关于索引的相关统计信息,然后把这些信息存储在数据字典中。这就可以避免以后对索引进行分析统计,而且优化器在优化SQL语句的时候可以随机使用这些统计信息,以确定是否生成使用该索引的执行计划。通常情况下,在生成索引的过程中统计索引的相关信息,其所花的代价是最小的。无论从时间上,还是从硬件资源的耗费上,都是非常小的。所以,在创建索引的过程中统计相关的索引信息是非常有用的。
 

  但是默认情况下,数据库是不采用这个选项的。这主要是因为一些事物处理系统,索引的信息是经常需要发生变化的。如果在索引创建的过程中统计了相关信息。这些信息随着索引的调整等等原因会很快的过时。所以说,其在默认情况下没有采用这个选项。可见这个选项并不是在任何情况下都能够起到效果。但是如果这个数据库系统是一个决策支持系统。其数据、索引等等在一段时间内基本上是稳定不变的。此时在创建索引时可以使用这个选项。如此的话,在生成索引时可以以最小的代价生成这些统计信息,方便优化器使用。笔者在部署数据库应用的时候,对于事务型的数据库系统,一般不会启用这个选项。但是对于一些决策性的数据库系统或者数据仓库中,创建索引时则笔者喜欢采用这个选项。这有助于提高数据库的性能。因为优化器在生成执行计划时,可以直接采用这个统计信息。所以,数据库能够在最短的时间内确定需要采用的执行计划。而且在执行计划制定中参考了这个索引统计信息,为此所生成的执行计划在同等条件下可能更加的合理。

可选项四:ONLINE,DML操作与创建索引操作是否可以同时进行

  默认情况下,数据库系统是不允许DML操作与创建索引的操作同时进行的。也就是说,在创建索引的过程中,是不允许其他用户对其所涉及的表进行任何的DML操作。这主要是因为对基础表进行DML操作时,会对基础表进行加锁。所以在基础表上的DDL事务没有递交之前,即没有对基础表进行解锁之前,是无法对这基础表创建索引的。反之亦然。显然此时数据库没有采用这个ONLIE选项,继之DML操作与创建索引操作同时进行,主要是从创建索引的效率出发的。防止因为两个作业相互冲突,从而延长某个作业的运行时间。
 

  但是有时会我们必须允许他们进行同时操作。如用户可能一刻都不能够离开数据库系统,需要时时刻刻对数据库基础表进行DML操作。而此时由于某些原因,数据库管理员又需要重新建立索引时,那么不得不在创建索引的语句中加入这个ONLINE选项。让他们同时运行。此时虽然可能会延长索引创建作业的时间,但是可以保障用户DML操作能够正常进行。有时候牺牲这个代价是值得的。用户是不能够等的,而我们数据库管理员则可以勉强的等一会儿。
 

  当然,如果用户对于这个DML操作及时性没有这么高。如数据库管理员在晚上员工没有使用数据库时创建索引时,则可以不带这个选项。在限制用户对基础表进行DML操作的同时,提高数据库创建索引的效率。
 

  可选项五:PARALLEL,多服务进程创建索引

  默认情况下,Oracle数据库系统不采用这个选项。这并不是说这个选项不可用,而是因为大多数情况下企业部署Oracle数据库时所采用的数据库服务器往往只有单个CPU。此时数据库系统是用一个服务进程来创建索引的。
 

  如果企业的服务器有多个CPU的话,则可以在创建索引时采用这个选项。因为只要采用了这个选项,则数据库就会使用多个服务进程来并行的创建索引,以提高索引创建的速度。为此,在同等条件下,多服务并行创建进索引并单服务创建索引速度要快的多。所以如果服务器中有多个CPU,而且需要创建的索引比较多或者基础表中记录比较多的话,则采用这个选项能够大幅度的提高索引的创建效率。
 

  故笔者建议,如果采用多CPU的服务器时,最好在创建索引时使用这个选项。不能够浪费了服务器的CPU呀。不然的话,多CPU服务器的优势就体现不出来了。为此采用这个选项,也是物尽其用。希望本文讲到的内容对大家能有所帮助。

http://www.ciotimes.com/bi/oracle/47539_1.html

猜你喜欢

转载自yijiangyanyu.iteye.com/blog/1569019