数据库索引
在oracle中,有很多理由需要使用索引,在一个OLTP系统中,有可能索引占用的空间会大于所在表占用的空间,对数据访问速度的加快也能提高后续的反应速度。我们知道,oracle提供了很多类型的索引 :
1.B树索引 这是最普通的索引,从oracle的早期版本就引入了。
2.位图索引(Bitmap indexes) 位图索引适用于一列只含有很少数量的不同的值,即low cardinality,这种索引对于只读数据库来说非常快,但是对于经常要进行更新操作来说就不适用了。
3.位图连接索引(Bitmap join indexes) 这种索引是多列索引(multi-column index),建立在和其他表进行连接的基础上。 这是唯一的建立这种索引的方法,它使用了和sql类似的from和where子句。
对SQL SERVER 索引可以加快数据检索的速度,但它会使数据的select,insert,delete变慢,对于聚集索引,数据是按照逻辑顺序存放在一定的物理位置,当变更数据时,根据新的数据顺序,需要将许多数据进行物理位置的移动。对非聚集索引,数据更新时也需要更新索引页,这也需要占用系统时间。因此在一个表中使用太多的索引,会影响数据库的性能。
在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引。
索引的管理成本
1、 存储索引的磁盘空间
2、 执行数据修改操作(INSERT、UPDATE、DELETE)产生的索引维护
3、 在数据处理时回需额外的回退空间。
对于索引的优化,从索引实现本身:
1.对于等职查询使用哈希结构的索引,对含非等值查询的使用B树。
2.压缩索引键值,减少索引层数
对于用户的选择来说:
1.对于查询一个范围的值,或者多个记录的值时使用聚集索引,而对于经常查询少数记录的使用非聚集索引
2.对于插入,删除,更新操作多的尽量不使用聚集索引,对于比较小的表结构最好不使用索引,因为索引带来的负荷可能成为瓶颈。
3.一般聚集索引只有一个,要将聚集索引建立在,用以缩小查询范围或需要排序的字段上
如何快速新建大数据量表的索引
如果一个表的记录达到100万以上的话,要对其中一个字段建索引可能要花很长的时间,甚至导致服务器数据库死机,因为在建索引的时候ORACLE要将索引字段所有的内容取出并进行全面排序,数据量大的话可能导致服务器排序内存不足而引用磁盘交换空间进行,这将严重影响服务器数据库的工作。解决方法是增大数据库启动初始化中的排序内存参数,如果要进行大量的索引修改可以设置10M以上的排序内存(ORACLE缺省大小为64K),在索引建立完成后应将参数修改回来,因为在实际OLTP数据库应用中一般不会用到这么大的排序内存。