在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡量应用系统成败的标准。而采用索引来加快数据处理速度也成为广大数据库用户所接受的优化方法。 cpDC*6L_X %R1VA9
三、覆盖索引(covering indexes)的使用 <kL3vv<z
@p =2(Mp
覆盖索引是指那些索引项中包含查寻所需要的全部信息的非聚簇索引,这种索引之所以比较快也正是因为索引页中包含了查寻所必须的数据,不需去访问数据页。如果非聚簇索引中包含结果数据,那么它的查询速度将快于聚簇索引。 f;PCH,2P(
MA-7-mx
但是由于覆盖索引的索引项比较多,要占用比较大的空间。而且update操作会引起索引值改变。所以如果潜在的覆盖查询并不常用或不太关键,则覆盖索引的增加反而会降低性能。 - OmIZG/
.?%~D] KG
四、索引的选择技术 !_/h)
V)Y(g'Hc{
p_detail是住房公积金管理系统中记录个人明细的表,有890000行,观察在不同索引下的查询运行效果,测试在C/S环境下进行,客户机是IBM PII350(内存64M),服务器是DEC Alpha1000A(内存128M),数据库为SYBASE11.0.3。 ' .O19+
mUucbe
.kyCp-f*7
1、 select count(*) from p_detail where 9Dq?=0Nqcn
op_date>’19990101’ and op_date<’ 2.<YIP
19991231’ and pri_surplus1>300 ''MFEPuDf
2k.& !BT
2、 select count(*),sum(pri_surplus1) from p_detail U"At1Gd|
where op_date>’19990101’ and :3\ bG-mb
pay_month between‘199908’ and’199912’ cs*&i, "
g9P}t[<d
?NKJ[]1g
不建任何索引查询1 1分15秒 T&7Zzf2k
g!W,n4K
查询2 1分7秒 3:$4'M<3
F D|~,
在op_date上建非聚簇索引查询1 57秒 Dv _w 2k
s#y.Ub)/
查询2 57秒 w67Bb
`bC2c[A
在op_date上建聚簇索引查询1 <1秒 WL>[+%/
6 D6~hC
查询2 52秒 qYO> O\@
EbX@A~y
在pay_month、op_date、pri_surplus1上建索引查询1 34秒 = k3GZoB1
R(V mq]^C
查询2 <1秒 3Xc>1SE*
Sh&smgB)f>
在op_date、pay_month、pri_surplus1上建索引查询1 <1秒 4\^ <4 F
/hUl%A@l
查询2 <1秒 =|6}#IeS
>2+]1
7B/o<
从以上查询效果分析,索引的有无,建立方式的不同将会导致不同的查询效果,选择什么样的索引基于用户对数据的查询条件,这些条件体现于where从句和join表达式中。一般来说建立索引的思路是: tjy?F=^6T
3$MH0d[,3
(1)、主键时常作为where子句的条件,应在表的主键列上建立聚簇索引,尤其当经常用它作为连接的时候。 /'fXU
^]+62f=)
(2)、有大量重复值且经常有范围查询和排序、分组发生的列,或者非常频繁地被访问的列,可考虑建立聚簇索引。 lYuCbJE$
/xr QJq
(3)、经常同时存取多列,且每列都含有重复值可考虑建立复合索引来覆盖一个或一组查询,并把查询引用最频繁的列作为前导列,如果可能尽量使关键查询形成覆盖查询。 MM&jRX<a
}%n7tbPD
(4)、如果知道索引键的所有值都是唯一的,那么确保把索引定义成唯一索引。 e{d+s;
o>xb~H`8C
(5)、在一个经常做插入操作的表上建索引时,使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生。如果在只读表上建索引,则可以把fillfactor置为100。 xv(ytay
O~ |&\
(6)、在选择索引键时,设法选择那些采用小数据类型的列作为键以使每个索引页能够容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必须遍历的索引页面降到最小。此外,尽可能地使用整数为键值,因为它能够提供比任何数据类型都快的访问速度。 "}}\=/~
E#|hR!