Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11674610
  • 博文数量: 8065
  • 博客积分: 10002
  • 博客等级: 中将
  • 技术积分: 96708
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-16 17:06
文章分类

全部博文(8065)

文章存档

2008年(8065)

分类: 服务器与存储

2008-12-31 13:37:57

  在Oracle数据库中,数据库管理员不仅在索引的选择上要花费一定的精力。而且,在索引的存储上,也有所讲究。因为索引与表一样,不仅需要在数据字典中保存索引的定义,还需要在表空间中为他分配实际的存储空间,并为其设置存储参数。数据库管理员若能够给索引分配合理的表空间,并且设置合适的参数的话,则可以在一定程度上提高数据库的运行效率。

  虽然说,在建立索引的过程中,不为其指定具体的存储参数也是可行的。索引会自动继承所处表空间的默认存储参数。不过,在数据库设计过程中,笔者是不建议这么做。因为这不能够发挥Oracle数据库高性能的优势。特别是在一些比较复杂的数据库设计中,一定要根据实际情况,合理的索引存储进行配置,以达到数据库性能优化的目的。

  具体的说,数据库管理员可以从如下几个方面入手,做好索引的存储管理。

  第一步:为索引指定存储的表空间。

  当数据库管理员为表或者字段建立索引的时候,可以选择是否指定具体的表空间。若没有具体指定的话,则数据库会自动在用户的默认表空间创建索引段。这里初学者要注意,索引的存储默认表空间不是跟着其所对应的数据库对象走,而是跟着用户走。也就是说,现在有一张员工信息表,要为其建立一个索引。并不是说这张员工信息表属于哪个表空间,这对应的索引默认也是哪个表空间。而这个索引的默认表空间是建立这个索引的用户的默认表空间。

  索引是对表中字段进行排序的一种手段。在数据库管理员创建索引的时候,Oracle首先对建立索引的字段进行排序,然后将排序后的字段值和相应记录的Rowid存储在索引段中。而这个数据存储,就需要用到一定的存储空间,即我们所为的表空间。若一张表中发索引比较复杂,则其索引本身的空间可能比表中数据所占用的空间还要大。可见,对于索引的表空间进行管理的必要性。

  在索引的建立过程中,对于其所存储的表空间没有特殊的限制。如不需要像其他数据库一样,要求把索引与表建立在同一个表空间或者磁盘上。数据库管理员可以根据企业自身的需求,合理的为索引分配存储空间。

  不过,笔者认为,最好能够把表与索引保存在不同的表空间中。因为Oracle数据库能够并行读取不同磁盘中的数据,从而达减少输入输入冲突的目的。而现在把索引与其对应的表存放在不同上的不同表空间中,就可以提高查询的效率。往往在数据库性能优化中,调整索引与基础表的表空间位置,这也是我们数据库管理员常用的手段之一。故,笔者建议,最好能够为索引建立一个独立的表空间,跟其对应的表分开存放。若数据库有多个磁盘的话,可以考虑分别存放在不同的磁盘上。

  另外,若把索引跟对应的表存储在不同的表空间中的话,在数据库备份的时候,要稍加注意。因为Oracle数据库允许数据库管理员以表空间为单位,对数据库进行备份与还原。此时,若把它们存储在不同的表空间的话,则对数据表所在的表空间进行备份的时候,就不会备份索引信息。在还原的时候,也不会自动把表空间对应的索引进行还原。所以,若把索引与表存放在同一个表空间中,则对于数据库备份来说,要方便一点。但是,这毕竟是次要的。比起数据库的性能来说,这点困难还是可以克服的。

  第二步:为提高更新性能合理配置空闲空间管理方式。

  索引不仅跟数据库的查询效率息息相关,而且,还跟数据库的更新有重要的影响。因为要对数据进行更新,往往伴随着对数据进行查询。所以,合理设置索引空闲空间的处理方式,可以有效的提高数据库的更新性能。

  数据库创建索引的时候,主要是通过Pctfree参数来指定为更新操作而预留的空闲空间百分比。如果数据库管理员把这个参数设置为80%。就表示数据块中的数据所占用的空间少于总空闲空间的80% 时,可以直接利用这个空闲空间来存储需要更新的数据。当现有数据块的数据超过了这个比例后,则发生更新动作时,就需要为其分配新的数据块了。

  可见,当频繁的为更新作业分配数据块的时候,会极大的影响数据更新的效率;同时,因为增加新的数据块,还会耗用服务器的硬件资源,如等等。这无疑会影响除了更新作业之外的其他作业,会对整个数据库的运行性能产生不利的影响。

  所以,在创建索引的时候,数据库管理员要合理的配置这个参数。具体什么参数是合适的,没有一个严格的标准。这主要是根据索引对应的表,是否需要进行频繁的更新来决定的。当这个索引所对应的表,可能要进行频繁的变更,则最好能够为其指定比较大的Pctfree参数,以提高数据库的更新性能。如对于ERP系统中的订单变更表或者价格信息表,起码要把这个参数指定为80%,或者更高。相反,对于系统中不怎么进行更新的产品基本信息表,则可以把这个参数设置为50%,或者更低。

  不过,数据库管理员需要注意,并不是说Pctfree参数设置的越大越好。这主要是因为天下没有白吃的午餐。Pctfree设置的比较大,并不是说是百利而无一害的。把Pctfree参数设置的偏大,是以牺牲存储空间未代价的。所以,对于一些更新很好的表,在为其建立索引的时候,没有必要为其指定比较大的Pctfree参数。我们也可以利用Pctused参数来进行类似的设置。这个参数的用途跟Pctfree大同小异,也是对索引空闲空间管理的一种方式。

  另外对于数据库表更新来说,还有一些索引管理手段,可以提高数据库的更新性能。如在企业导入基础数据的时候,若某需要在某张表中插入大量数据,则此时最好能够把这张表中的索引先取消掉。因为根据索引的工作机制,每在数据库表中插入一条记录的时候,数据库都要根据插入的数据,更改索引。若插入的记入比较多,而这张表的索引也比较复杂的话,则数据更新的效率就会比较慢。为了提高数据表导入的效率,最好能够在这个工作之前先把索引都禁用掉。等到导入完毕后,再重新启用索引。

  第三步:为索引指定区分配方式。

  在索引创建过程中,虽然可以通过Storage语句来指定存储空间的区分配方式。但是,笔者觉得这个没有多大的实际意义。一方面起指定的参数比较少,只能够指定创建索引时分配的第一个区的大小。另一方面,这对于提高数据库的性能、索引的管理效率,没有多大的效果。

  所以,笔者在创建索引的过程中,基本上是不用Storage语句来指定其存储空间的区分配方式。或许其他数据库管理员有不同的见解,大家可以讨论讨论。

  总之,笔者认为对索引进行优化的时候,主要是涉及到前面两个方面。一是要把索引跟其对应的表存储在不同硬盘的不同表空间上。二是若索引所对应的表可能涉及到比较频繁的更新的话,则可以考虑把Pctfree参数设置的高一点。

阅读(2357) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~