4.2.1 执行效率比较
虽然前面介绍的四种查寻方法在适用时机上各有不同,但是这些方法也可以执行类似的查寻工作。因此,如果在一个查寻工作中同时可以使用这四种方法,那么除了可能因为开发人员各人的喜好不同而会选择不同的方法之外,到底哪一种方法的执行效率比较好?还是这些方法的执行效率的结果都一样?这些方法查寻索引字段的结果和查寻非索引字段的结果是不是一样?查寻少量数据和查寻大量数据有没有什么不同?
这些问题也许是许多人不曾注意的,但是在结果数据集中查寻数据却是许多应用程序经常执行的工作,因此,了解并且能够应付这些问题是非常重要的。本节就会讨论许多重要的问题,并且在稍后的章节中继续说明如何有效率地查寻数据。
查寻索引字段
当开发人员使用Locate、Lookup、过滤器和SetRange查寻索引字段的数据时,到底它们的执行效率如何?表4-4和图4-19是使用这些方法在CHINESEDEMO.GDB中查寻索引字段数据的结果。从表中可以看出,这些方法的执行效率几乎都是一样的,因此使用哪一种方法查寻数据并没有多大的区别。
表4-4
|
方法 |
耗时 |
|
Locate |
0.077 |
|
Lookup |
0.078 |
|
Filter |
0.079 |
|
OnFilterRecord |
0.080 |
|
SetRange |
0.078 |

图4-19 查寻索引字段的执行结果
查寻非索引字段
表4-5和图4-20是查寻非索引字段的执行结果,令人讶异的是查寻索引字段和查寻非索引字段在执行效率上并没有什么不同。
表4-5
|
方法 |
耗时 |
|
Locate |
0.078 |
|
Lookup |
0.078 |
|
Filter |
0.079 |
|
OnFilterRecord |
0.080 |
|
SetRange |
NA |

图4-20 查寻非索引字段的执行结果
查寻拥有大量数据的数据表
接着我们在一个拥有50 000笔数据的数据表中查寻一笔特定的数据,表4-6和图4-21显示了执行的结果。
表4-6
|
方法 |
耗时 |
|
Locate |
11.988 |
|
Lookup |
12.073 |
|
Filter |
12.21 |
|
OnFilterRecord |
12.875 |
|
SetRange |
11.687 |

图4-21 查寻大量结果数据集的结果
从这个结果中可以看到SetRange有最好的执行效率,但是对于一笔查寻数据需要超过10秒的结果来说,快了零点几秒并没有什么意义,都是一样的缓慢。因此这些查寻方法对于结果数据集中拥有大量数据的情形并不适用,稍后的章节会说明如何克服这种状况。
从上面的各种执行数据来看,当结果数据集中的数据数目并不多时,例如CHINESEDEMO.GDB只有几十笔的数据,那么Locate、Lookup、Filter和SetRange都非常地有效率,至于OnFilterRecord事件处理函数似乎表现得更好。在小量数据的结果数据集中查寻索引和非索引字段似乎也没有多大的分别,因为就如Delphi在线辅助中说明的一样,这些方法会自动地使用最好的方式来查寻数据。但是请注意,这个结果是对于数据表中数据量少的情形,如果数据表中包含大量的数据,那么不管你使用哪一种查寻方法都是非常缓慢的,在稍后的章节中本书会详细地说明。
下面的规则大概列出了在什么时机应该使用的查寻方法,在稍后的小节中会继续讨论如何有效率地在结果数据集中查寻数据。
当使用Locate或是Lookup查寻多个字段时,如果查寻字段包含了索引字段,那么最好把索引字段放在最前面,这样可以加快查寻的速度。
同样,当使用TSimpleDataSet的Filter特性值来查寻多个字段时,最好也把索引字段的条件数值放在最前面,以增加查寻的速度。
如果想以复杂的条件来查寻结果数据集中的数据,那么可以使用TSimpleDataSet的OnFilterRecord事件处理函数。
当结果数据集中的数据不多,而且用户想以特定的条件分类数据时,可以考虑使用过滤器来完成这个工作,这样比较有效率。
上面的数个法则虽然可以合理地加快查寻数据的速度,但是当开发人员需要处理大量的数据,或是想要有更好的查寻效率时,就需要对于dbExpress和DataSnap处理数据的原理有更多的认识,使用更多的技巧。在下面的章节中将会继续讨论如何从dbExpress和DataSnap中开发出更多的执行效率。






