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