在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡量应用系统成败的标准。
四、索引的选择技术 LP(j`x(
#yI{ b O
p_detail是住房公积金管理系统中记录个人明细的表,有890000行,观察在不同索引下的查询运行效果,测试在C/S环境下进行,客户机是IBM PII350(内存64M),服务器是DEC Alpha1000A(内存128M),数据库为SYBASE11.0.3。 OnLOe{-s
L V%$ 9?
.>`Z;cg=v
1、 select count(*) from p_detail where /Y5upo
op_date>’19990101’ and op_date<’ \Z,lQ@q-
19991231’ and pri_surplus1>300 \U=iA
X4E| c/Mu=
2、 select count(*),sum(pri_surplus1) from p_detail V4'|8SS\
where op_date>’19990101’ and [?FS&THL
pay_month between‘199908’ and’199912’ MyM=<z*
EDhMN2
+y8=`>_O
不建任何索引查询1 1分15秒 q1Ybfh
-LhM'^Zb"
查询2 1分7秒 \TpYHk
!suAi,o^
在op_date上建非聚簇索引查询1 57秒 [^ zCd
&(-{{_c
查询2 57秒 5I;QA"20"
ORIUM; e
在op_date上建聚簇索引查询1 <1秒 gtj>/!F
BF@0Eu{W
查询2 52秒 ![ fE5e%{
{<z:B|0*
在pay_month、op_date、pri_surplus1上建索引查询1 34秒 [ e5{),^
aa_j#|W5
查询2 <1秒 3<@ w~YJx8
9<bzqxY
在op_date、pay_month、pri_surplus1上建索引查询1 <1秒 MmAjNB Sv!
"~N&#C+!d
查询2 <1秒 pG5yJkU7c
A<(O)X`'
X+C=j;=
从以上查询效果分析,索引的有无,建立方式的不同将会导致不同的查询效果,选择什么样的索引基于用户对数据的查询条件,这些条件体现于where从句和join表达式中。一般来说建立索引的思路是: g~G#Y%
&_tFNzPP"Y
(1)、主键时常作为where子句的条件,应在表的主键列上建立聚簇索引,尤其当经常用它作为连接的时候。 /+X:,bz+)
374I]GJ
(2)、有大量重复值且经常有范围查询和排序、分组发生的列,或者非常频繁地被访问的列,可考虑建立聚簇索引。 WXxGV%$ 6
_EKPM4X
(3)、经常同时存取多列,且每列都含有重复值可考虑建立复合索引来覆盖一个或一组查询,并把查询引用最频繁的列作为前导列,如果可能尽量使关键查询形成覆盖查询。 ;h.{y'grf
K~kkKM8,
(4)、如果知道索引键的所有值都是唯一的,那么确保把索引定义成唯一索引。 |68@# l
K?NsABU
(5)、在一个经常做插入操作的表上建索引时,使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生。如果在只读表上建索引,则可以把fillfactor置为100。 R$F@sM{
L0AJ"!
(6)、在选择索引键时,设法选择那些采用小数据类型的列作为键以使每个索引页能够容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必须遍历的索引页面降到最小。此外,尽可能地使用整数为键值,因为它能够提供比任何数据类型都快的访问速度。 )3%78E}1
cxMh ;E