有些新手在Oracle数据库中创建索引时往往不会使用可选项其实有时候在合适的场合使用一些可选项可以提高索引的创建速度如为了大批量导入数据我们往往会先取消索引其以提高插入的速度然后等数据导入完毕后再重新创建索引在这个过程中如果能够采用一些可选项则可以缩短索引创建的时间在Oracle数据库中提供了丰富的可选项我们常用的可选项主要有以下这些 可选项一NOSORT记录排序可选项 默认情况下在表中创建索引的时候会对表中的记录进行排序排序成功后再创建索引但是当记录比较多的是这个排序作业会占用比较多的时间这也就增加了索引建立的时间(排序作业是在索引创建作业中完成)有时候我们导入数据的时候如采用insert into 语句插入数据过程中同时采用Order by子句对索引字段进行了排序此时如果在索引创建过程中再进行排序的话就有点脱裤子放屁多此一举了为此在重新创建索引时如果表中的数据已经排好序了(按索引字段排序)那么在创建索引时就不需要为此重新排序此时在创建索引时数据库管理员就可以使用NOSORT可选项告诉数据库系统不需要对表中当记录进行重新排序了 采用了这个选项之后如果表中的记录已经按顺序排列那么在重新创建索引的时候就不会重新排序可以提高索引创建的时间节省内存中的排序缓存空间相反如果表中的记录是不按索引关键字排序的话那么此时采用NOSORT关键字的话系统就会提示错误信息并拒绝创建索引所以在使用NOSORT可选项的时候数据库管理员尽管放心大胆的使用因为其实在不能够使用这个选项的时候数据库也会明确的告知为此其副作用就比较少数据库管理员只需要把这个可选项去掉然后重新执行一次即可不过这里需要注意的是如果表中的记录比较少的话那么使用NOSORT选项的效果并不是很明显当采用insert into批量导入数据并在这个过程中采用了Order by子句对索引关键字进行了排序的话则此时采用NOSORT选项的话往往能够起到比较好的效果 可选项二NOLOGGING是否需要记录日志信息 在创建索引的时候系统会把相关的信息存储到日志信息中去如果表中的记录比较多则需要一一的把这些信息记录到日志文件中这显然会让数据库增加很大的工作量从而增加索引创建的时间为此在创建索引的过程中如果有必要时我们可以采用NOLOGGING选项让数据库在创建索引的过程中不产生任何重做日志信息此时当表中的记录比较多时就可以明显提高速度 但是默认情况下数据库在在创建索引时是不采用这个选项的即会把相关的信息保存到重做日志中去这虽然降低了索引创建的效率但是如果遇到什么意外的话却可以利用重做日志来进行恢复所以此时数据库管理员就比较难以抉择了一方面是数据的安全另一方面是索引创建的速度根据笔者的经验只要数据库服务器比较稳定而数据库中约束机制又比较完善的话那么在创建索引的过程中一般不会出现问题可以放心大胆的使用这个可选项 但是如果数据库已经使用了好几年了后来因为某种原因需要重建索引在这种情况下由于数据库使用过程中很多因素数据库管理员无法控制此时为这种类型的数据库创建索引时为了保险起见还是不要采用这个选项好因为此时遇到错误的几率相对来说会搞一点为此此时牺牲一下索引创建的速率而提高数据的安全性还是有必要的万一遇到什么问题时可以通过重做日志来及时的恢复数据为企业用户减少损失 可选项三COMPUTE STATISTICS是否生成统计信息 如果管理员在创建索引时采用了这个选项则数据库将在创建索引的过程中以非常小的代价直接生成关于索引的相关统计信息然后把这些信息存储在数据字典中这就可以避免以后对索引进行分析统计而且优化器在优化SQL语句的时候可以随机使用这些统计信息以确定是否生成使用该索引的执行计划通常情况下在生成索引的过程中统计索引的相关信息其所花的代价是最小的无论从时间上还是从硬件资源的耗费上都是非常小的所以在创建索引的过程中统计相关的索引信息是非常有用的 但是默认情况下数据库是不采用这个选项的这主要是因为一些事物处理系统索引的信息是经常需要发生变化的如果在索引创建的过程中统计了相关信息这些信息随着索引的调整等等原因会很快的过时所以说其在默认情况下没有采用这个选项可见这个选项并不是在任何情况下都能够起到效果但是如果这个数据库系统是一个决策支持系统其数据索引等等在一段时间内基本上是稳定不变的此时在创建索引时可以使用这个选项如此的话在生成索引时可以以最小的代价生成这些统计信息方便优化器使用笔者在部署数据库应用的时候对于事务型的数据库系统一般不会启用这个选项但是对于一些决策性的数据库系统或者数据仓库中创建索引时则笔者喜欢采用这个选项这有助于提高数据库的性能因为优化器在生成执行计划时可以直接采用这个统计信息所以数据库能够在最短的时间内确定需要采用的执行计划而且在执行计划制定中参考了这个索引统计信息为此所生成的执行计划在同等条件下可能更加的合理 可选项四ONLINEDML操作与创建索引操作是否可以同时进行 默认情况下数据库系统是不允许DML操作与创建索引的操作同时进行的也就是说在创建索引的过程中是不允许其他用户对其所涉及的表进行任何的DML操作这主要是因为对基础表进行DML操作时会对基础表进行加锁所以在基础表上的DDL事务没有递交之前即没有对基础表进行解锁之前是无法对这基础表创建索引的反之亦然显然此时数据库没有采用这个ONLIE选项继之DML操作与创建索引操作同时进行主要是从创建索引的效率出发的防止因为两个作业相互沖突从而延长某个作业的运行时间 但是有时会我们必须允许他们进行同时操作如用户可能一刻都不能够离开数据库系统需要时时刻刻对数据库基础表进行DML操作而此时由于某些原因数据库管理员又需要重新建立索引时那么不得不在创建索引的语句中加入这个ONLINE选项让他们同时运行此时虽然可能会延长索引创建作业的时间但是可以保障用户DML操作能够正常进行有时候牺牲这个代价是值得的用户是不能够等的而我们数据库管理员则可以勉强的等一会儿 当然如果用户对于这个DML操作及时性没有这么高如数据库管理员在晚上员工没有使用数据库时创建索引时则可以不带这个选项在限制用户对基础表进行DML操作的同时提高数据库创建索引的效率 可选项五PARALLEL多服务进程创建索引 默认情况下Oracle数据库系统不采用这个选项这并不是说这个选项不可用而是因为大多数情况下企业部署Oracle数据库时所采用的数据库服务器往往只有单个CPU此时数据库系统是用一个服务进程来创建索引的 如果企业的服务器有多个CPU的话则可以在创建索引时采用这个选项因为只要采用了这个选项则数据库就会使用多个服务进程来并行的创建索引以提高索引创建的速度为此在同等条件下多服务并行创建进索引并单服务创建索引速度要快的多所以如果服务器中有多个CPU而且需要创建的索引比较多或者基础表中记录比较多的话则采用这个选项能够大幅度的提高索引的创建效率 故笔者建议如果采用多CPU的服务器时最好在创建索引时使用这个选项不能够浪费了服务器的CPU呀不然的话多CPU服务器的优势就体现不出来了为此采用这个选项也是物尽其用 |