免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1300 | 回复: 0
打印 上一主题 下一主题

[RAID与磁盘阵列] 索引存储关系到数据库运行效率 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-31 13:37 |只看该作者 |倒序浏览

  在Oracle数据库中,数据库管理员不仅在索引的选择上要花费一定的精力。而且,在索引的存储上,也有所讲究。因为索引与表一样,不仅需要在数据字典中保存索引的定义,还需要在表空间中为他分配实际的存储空间,并为其设置存储参数。数据库管理员若能够给索引分配合理的表空间,并且设置合适的参数的话,则可以在一定程度上提高数据库的运行效率。
  虽然说,在建立索引的过程中,不为其指定具体的存储参数也是可行的。索引会自动继承所处表空间的默认存储参数。不过,在数据库设计过程中,笔者是不建议这么做。因为这不能够发挥Oracle数据库高性能的优势。特别是在一些比较复杂的数据库设计中,一定要根据实际情况,合理的索引存储进行配置,以达到数据库性能优化的目的。
  具体的说,数据库管理员可以从如下几个方面入手,做好索引的存储管理。
  第一步:为索引指定存储的表空间。
  当数据库管理员为表或者字段建立索引的时候,可以选择是否指定具体的表空间。若没有具体指定的话,则数据库会自动在用户的默认表空间创建索引段。这里初学者要注意,索引的存储默认表空间不是跟着其所对应的数据库对象走,而是跟着用户走。也就是说,现在有一张员工信息表,要为其建立一个索引。并不是说这张员工信息表属于哪个表空间,这对应的索引默认也是哪个表空间。而这个索引的默认表空间是建立这个索引的用户的默认表空间。
  索引是对表中字段进行排序的一种手段。在数据库管理员创建索引的时候,Oracle首先对建立索引的字段进行排序,然后将排序后的字段值和相应记录的Rowid存储在索引段中。而这个数据存储,就需要用到一定的存储空间,即我们所为的表空间。若一张表中发索引比较复杂,则其索引本身的空间可能比表中数据所占用的空间还要大。可见,对于索引的表空间进行管理的必要性。
  在索引的建立过程中,对于其所存储的表空间没有特殊的限制。如不需要像其他数据库一样,要求把索引与表建立在同一个表空间或者磁盘上。数据库管理员可以根据企业自身的需求,合理的为索引分配存储空间。
  不过,笔者认为,最好能够把表与索引保存在不同的表空间中。因为Oracle数据库能够并行读取不同磁盘中的数据,从而达减少输入输入冲突的目的。而现在把索引与其对应的表存放在不同
硬盘
上的不同表空间中,就可以提高查询的效率。往往在数据库性能优化中,调整索引与基础表的表空间位置,这也是我们数据库管理员常用的手段之一。故,笔者建议,最好能够为索引建立一个独立的表空间,跟其对应的表分开存放。若数据库
服务器
有多个磁盘的话,可以考虑分别存放在不同的磁盘上。
  另外,若把索引跟对应的表存储在不同的表空间中的话,在数据库备份的时候,要稍加注意。因为Oracle数据库允许数据库管理员以表空间为单位,对数据库进行备份与还原。此时,若把它们存储在不同的表空间的话,则对数据表所在的表空间进行备份的时候,就不会备份索引信息。在还原的时候,也不会自动把表空间对应的索引进行还原。所以,若把索引与表存放在同一个表空间中,则对于数据库备份来说,要方便一点。但是,这毕竟是次要的。比起数据库的性能来说,这点困难还是可以克服的。
  第二步:为提高更新性能合理配置空闲空间管理方式。
  索引不仅跟数据库的查询效率息息相关,而且,还跟数据库的更新有重要的影响。因为要对数据进行更新,往往伴随着对数据进行查询。所以,合理设置索引空闲空间的处理方式,可以有效的提高数据库的更新性能。
  数据库创建索引的时候,主要是通过Pctfree参数来指定为更新操作而预留的空闲空间百分比。如果数据库管理员把这个参数设置为80%。就表示数据块中的数据所占用的空间少于总空闲空间的80% 时,可以直接利用这个空闲空间来存储需要更新的数据。当现有数据块的数据超过了这个比例后,则发生更新动作时,就需要为其分配新的数据块了。
  可见,当频繁的为更新作业分配数据块的时候,会极大的影响数据更新的效率;同时,因为增加新的数据块,还会耗用服务器的硬件资源,如
内存
等等。这无疑会影响除了更新作业之外的其他作业,会对整个数据库的运行性能产生不利的影响。
  所以,在创建索引的时候,数据库管理员要合理的配置这个参数。具体什么参数是合适的,没有一个严格的标准。这主要是根据索引对应的表,是否需要进行频繁的更新来决定的。当这个索引所对应的表,可能要进行频繁的变更,则最好能够为其指定比较大的Pctfree参数,以提高数据库的更新性能。如对于ERP系统中的订单变更表或者价格信息表,起码要把这个参数指定为80%,或者更高。相反,对于系统中不怎么进行更新的产品基本信息表,则可以把这个参数设置为50%,或者更低。
  不过,数据库管理员需要注意,并不是说Pctfree参数设置的越大越好。这主要是因为天下没有白吃的午餐。Pctfree设置的比较大,并不是说是百利而无一害的。把Pctfree参数设置的偏大,是以牺牲存储空间未代价的。所以,对于一些更新很好的表,在为其建立索引的时候,没有必要为其指定比较大的Pctfree参数。我们也可以利用Pctused参数来进行类似的设置。这个参数的用途跟Pctfree大同小异,也是对索引空闲空间管理的一种方式。
  另外对于数据库表更新来说,还有一些索引管理手段,可以提高数据库的更新性能。如在企业导入基础数据的时候,若某需要在某张表中插入大量数据,则此时最好能够把这张表中的索引先取消掉。因为根据索引的工作机制,每在数据库表中插入一条记录的时候,数据库都要根据插入的数据,更改索引。若插入的记入比较多,而这张表的索引也比较复杂的话,则数据更新的效率就会比较慢。为了提高数据表导入的效率,最好能够在这个工作之前先把索引都禁用掉。等到导入完毕后,再重新启用索引。
  第三步:为索引指定区分配方式。
  在索引创建过程中,虽然可以通过Storage语句来指定存储空间的区分配方式。但是,笔者觉得这个没有多大的实际意义。一方面起指定的参数比较少,只能够指定创建索引时分配的第一个区的大小。另一方面,这对于提高数据库的性能、索引的管理效率,没有多大的效果。
  所以,笔者在创建索引的过程中,基本上是不用Storage语句来指定其存储空间的区分配方式。或许其他数据库管理员有不同的见解,大家可以讨论讨论。
  总之,笔者认为对索引进行优化的时候,主要是涉及到前面两个方面。一是要把索引跟其对应的表存储在不同硬盘的不同表空间上。二是若索引所对应的表可能涉及到比较频繁的更新的话,则可以考虑把Pctfree参数设置的高一点。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/66684/showart_1764146.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP