索引管理指南¶
索引在逻辑上和物理上都与相关的表的数据无关。作为无关的结构,索引需要存储空间。创建或者删除一个索引,不会影响基本的表、数据库应用或者其他索引。当插入、更改或删除相关的表的行时,如果牵涉到建立索引的属性列,会更新相应的索引的属性列。如果删除索引,所有的应用仍可以继续工作,但访问速度比建立索引时候的访问速度下降。
管理索引包括以下内容:
- 插入表数据后创建索引
索引可以在插入或者装载了数据之后创建,也可以在相应的表还是空表的时候创建。在插入或者装载了数据之后为表创建索引会更加有效率。如果在装载数据之前创建了一个或者多个索引,每次往物理表中插入一条元组,相应的,就会向每个索引插入一条索引元组。另外如果索引极少被更新,那么在装载数据之后创建索引,可以更好的利用存储空间。
- 对正确的表与列进行索引
使用下面的准则来决定何时创建索引:
如果要经常检索大表中少于15%的元组,就需要创建索引。这个百分比的确定取决于物理表的扫描的相关速度。表扫描越快,百分比取得越低
为改善多个表的连接性能,索引列常用于连接
注解
如果表上有主键或者唯一性键值约束,系统会自动创建一个索引。
小表不需要建立索引。如果查询所用时间变长了,那么,要么是这个表变长或者在这个表上面有高度并发的操作。此时,就需要在合适的列上建立索引。
- 对索引列排序以提高性能
在CREATE INDEX语句中列的排序会影响查询的性能。通常,将最常用的列放在最前面。
如果创建了一个索引来加速存取多列的查询,如在Col1,Col2和Col3上面建立索引,那么查询Col1或者Col1和Col2以及三个列都需要检索的情况下可以利用索引,但是,如果仅存取Col2,或者Col3或者Col2和Col3两个属性,那么优化器就不会利用这个索引。
- 限制每个表上的索引数目
一个表上的索引越多,修改表的开销就越多。特别的是向物理表插入或者删除一个元组的时候,需要对所有的索引插入或者删除一个元组。更新物理表中的一个元组的某个属性列时,包含改列的所有索引都需要同时被更新。
因此,在表中查询数据的速度和更改表的速度之间有一个协调。如果物理表的更新比较多,那么建议除了必须要建立的主键唯一键等索引外尽量少建立索引。
- 删除不再需要的索引
在以下情况下,考虑删除索引:
- 索引不能加速查询
- 应用中的查询使用不到的索引
- 清理索引中的空页面
在数据库大量的增删操作下,索引的结构会不断向右扩展,而被删除的值在索引中可能遗留为空页面。这些空索引页的存在不仅占用宝贵的存储资源,而且会对索引扫描性能造成显著拖累,从而降低整体数据库系统的响应速度与吞吐量。
因此,为提高数据库运行效率及资源利用率,需要及时地清理索引中存在的空页面。
- 指定索引数据块空间使用
在创建索引时候,如果物理表不为空,就需要根据物理表中的数据填充索引的数据块,填充的值有填充系数FILL确定。但一个索引的数据块中元组个数达到FILL系数确定的个数的时候,就给索引分配下一个块。如果一个索引创建好了之后插入或者删除的应用不多,可以把FILL参数取的大一点,对于静态索引,FILL参数可以取成100。如果是更新特别是插入频繁的应用比较多,FILL参数需要取的小一点。
在插入一个元组的时候,如果插入元组的索引数据块已经没有空间,就需要分裂这个数据块,分裂之后的两个数据块的元组分配由SPLIT参数确定。
- 估算索引尺寸并设置存储参数
创建索引之前先估计索引的大小能够更好的规划和管理磁盘空间。可以利用索引元组的大小,索引FILL参数以及SPLIT参数来估计索引所需要的磁盘空间大小。
估计单个索引的大小,能更好的管理磁盘空间。在创建索引或者ALTER INDEX的时候可以根据估计的索引大小确定适当存储参数,并改善使用该索引的I/O性能。例如,在创建索引之前估计出索引的最大大小,在创建的时候就指定相应的索引初始空间,创建索引的时候就会一次性的为索引分配足够的空间,该索引的所有数据都被保存在连续的磁盘空间扇区中。这样就减少了相应I/O的时间。
- 为每个索引指定表空间
可以在任何得到权限的表空间中创建索引。既可以在建立索引的物理表的相同表空间或者不同的表空间中创建索引。当将表和索引放在不同的表空间中的时,如这两个表空间在不同的磁盘中,由于减少了磁盘竞争,性能会比放在同一个表空间中要好。
- 考虑重建与合并索引的代价与益处
建立索引时,若列选择不适当会引起磁盘空间的浪费;另外,由于频繁的插入删除操作也可能引起的索引碎片,这个时候可以考虑合并索引或者重建索引。
重建索引可能会收缩索引的高度同时还可以根据新的情况指定表空间和存储参数。
合并索引可以根据应用的实际情况,调整建立索引的属性列的序列和属性列的重新分配。例如,Col1和Col2总是同时访问,而这两个属性上分别建立了索引,这个时候就必须考虑合并索引。