在数据库中,对某些表正确地建立索引,可以使得相关的查询效率大大提高。同样,在esProc中,也可以为排列或者序表建立索引序列,以提高反复查询数据时的效率。
我们经常需要在人员表中进行查询,如下例中的Employee表。
| A | B | C | |
| 1 | =connect("esProc") | ||
| 2 | =A1.query("select Eid,Name,FirstName,State from employee") | 5000 | |
| 3 | >A2.dsc(Name+" "+FirstName:FullName) | 100 | |
| 4 | =C3.(A2(int(rand()*C2)+1).FullName) |
A3格中表达式在A2排列中添加伪字段FullName,A2中结果如下(共5000条记录):

第四行中,随机获取100个FullName作为查询条件进行查询(这里允许重复),存储在A4中,A4中数据如下:

下面,为了考察索引序列的作用,将分别在有无索引的情况下,根据A4中的100个姓名,在A2的数据中查找员工资料,在测试中,只返回第一个找到的记录。
首先来看不使用索引的情况,由于Employee中是用员工编号Eid排序的,因此在检索姓名时,无法使用二分法。
| 6 | =now() | =C3.((a=#,A2.select@1(FullName==A4(a)))) |
| 7 | =interval@ms(A6,now()) |
A6和A7中的表达式,通过now()函数来获取当前时间,来大致估算查询用时(毫秒数),查询结果记录在B6中,查询结果如下:

用时估算如下:

再来看使用索引的情况:
| 9 | =now() | =A2.psort(FullName) |
| 10 | =C3.((a=#,A2(B9.select@1b(A2(~).FullName:A4(a))))) | |
| 11 | =interval@ms(A9,now()) |
首先在B9中建立对FullName的索引序列,这样在查询时就可以利用索引使用二分法进行查询。为了比较是否使用索引序列情况下的效率,建立索引所耗费的时间也被记录在用时中。B9中的索引序列记录了A2按FullName进行排序的记录编号,如下所示:

B10中的查询结果与B6是相同的:

A11中的用时估算如下:

可见,在使用了索引序列的情况下,利用二分法进行查询,可以有效地提高查询速度。但是需要注意的是,建立索引序列本身也是需要进行计算的,利用索引序列进行的查询次数越多,查询效率的提高越明显。当需要进行查询的次数比较少时,建立索引序列可能就不必要了。

686

被折叠的 条评论
为什么被折叠?



