1. 索引的概念
1.1 索引的优点
索引是表的一个或多个列的键值的有序列表,创建索引的原因有2个:
- 确保一个或多个列中值的唯一性
- 提高对表进行的查询的性能。当查询时想要以更快的速度找到所需要的列,或要以索引的顺序显示查询结果时,DB2优化器选择使用索引
2. 索引类型
2.1 唯一索引和非唯一索引
唯一索引:只允许列表中出现唯一一个键值
非唯一索引:允许重复的键值
2.2 群集索引
群集索引允许对数据页采用更线性的访问模式,允许更有效的预取,并且有助于避免排序。这意味着插入时间久,但查询操作会更快
使用群集索引时,应该考虑将数据页和索引页上的空闲空间增大为约15到35(而不是PCTFREE默认值10),以允许大容量的插入
群集索引的好处包括:
- 在每个数据分区内,数据页以键的顺序排列
- 群集索引改善了以键的顺序扫描整张表的性能。这是因为扫描访问第一页的第一行,然后访问同页上的每一行,在访存了该页上的所有行之后,才移至下一页。这样的好处是按照index来取数据时,磁头不会乱跑,从而提高了性能
3. 索引设计
3.1 创建索引注意事项
- 不创建冗余索引
- 确保创建的索引被引用
- 考虑索引的维护成本
- 需要考虑索引列的顺序
3.2 创建唯一性索引与非唯一性索引
下面是按照EMPLOYEE表中的LASTNAME创建称为IND_LNAME并且按照升序排列的非唯一性索引
下面是基于电话号码列创建唯一的索引
3.3 创建群集索引
Tips :DB2表数据被删除时候,空间不会被释放,而是在原数据上加了一个delete标志,表示该行的空间可以使用,当需要向表中insert数据时,db2会扫描整个表空间,然后将新行置于可用的表空间,而如果指定了append on 属性,那么db2将不再搜索空闲表空间,而是把数据直接插入到表的最后,这样可以提高效率。这种适合于那些大批量追加的历史表,使用append on 属性后,注意定义reorg table
新建群集索引
但是上述两种不能同时存在
否则报错如下:
3.4 创建双向索引
在这种情况下,基于给定列FIRSTNME中的递减值形成索引。
4.完全索引访问
CREATE INDEX语句的INCLUDE字句指定在创建索引时,可以选择包含的附加列数据,这些附加的列数据将与索引存储在一起,但实际上这不是键本身的一部分,所以不被排序,在强制执行索引的唯一性时不考虑被包含的列。
例如执行如下查询:
下面语句是创建一个提高性能的可能索引
本质上,FIRSTNME数据是被复制存储的,数据被更新时,副本也会被更新,对数据库是很大的开销。
INCLUDE只能用在创建唯一性索引中
5.创建索引相关问题
1)如果能在一个合理的时间内结束查询,应避免添加索引,因为索引会降低更新操作的速度并占用额外的空间。
2)基数较大的列很适合用来作索引
3)考虑管理上的开销,应避免在索引中使用多余5个列
4)对于多列索引,将查询中引用最多的列放在定义的前面
5)避免添加与已有索引相似的索引
6)如果表是只读的,并且包含很多行,那么可以尝试定义一个索引,通过CREATE INDEX中的INCLUDE字句使用该索引包含查询中引用的所有列
7)对于联机事务处理(OLTP)环境,创建一个或者两个索引;对于只读查询环境,可以创建5个以上索引;对于混合查询和OLTP环境,可以创建2到5个环境
8)避免在建有索引的列上使用函数
9)在哪些需要排序的列上建立索引
6.影响索引的相关配置
6.1 参数配置
6.1.1 util_heap_sz 配置参数
该参数为大型实用程序堆,在同步更新阶段,大型实用程序堆将提高创建或重组索引的速度。
6.1.2 sheapthres 配置参数
每个子代理程序将获取sortheap配置参数所指定的内存量,以便在扫描表时避免内存溢出。
6.2 为索引指定不同的表空间
可将索引存储在与数据不同的表空间,这样,通过减少索引访问的时间读/写磁头的移动,可以更有效的使用磁盘存储器。也可以更快的在物理设备上创建索引表空间