Chuck Cooper 软件开发主管 Ameripay Payroll
摘要: 描述了Ameripay公司参照“如何在.Net应用程序中对记录进行分页”一文实现提高应用程序性能的过程,“如何在.Net应用程序中对记录进行分页”是Microsoft模式&实践一书中关于提高.NET应用程序性能和可扩展性的章节。
背景
我曾经为全球排名前2000的公司开发Web应用程序,所以编写的软件必须能够支持50,000到100,000的雇员,毕竟,每个公司都应为他们的应用程序负责。我现在在Ameripay从事的薪水和人力资源应用程序使用了ASP模型并且被部署在我们的主办公室里,作为服务端为我们的所有客户服务。
我们定位于中小公司,因为如果客户数目超过2000,性能上就会有额外的压力。含有10到100行的典型小列表(由于所有行均被放入数据库中的一个块中,即使在表扫描情况下性能开销也很小,所以不需要索引) 会产生一个有20,000到200,000行的表(这在表扫描情况下会导致明显的延迟)。平均有1000个条目的列表在数据库中则会产生有2百万行的表。像薪水支票这类条目—我们每月会产生约25万薪水支票,但是每个支票也许附带有10份收入和扣除款项—这样每个月数据库里就会产生数百万行。
我在我的性能和可测性计划里要提到的最后一点是我们持续的快速增长率。在过去的8年里,我们平均增长率超过了750%,使我们在过去的两年里一直是成长最快的私营公司。一年前我开始的时候,我们有1,500 个客户公司,今天我们有2000个,并且在继续增长。2005年一月我们创造了新客户数目的新记录。所以当我设计系统时,必须使其在不久的将来能够适应以下情况:即客户增长幅度为5,000到10,000。
考虑到这些通常关注的情况,这就需要我尽一切可能来优化性能—这就是为什么我发现Microsoft 模式& 实践 一书中的提高 .NET 应用程序性能和可测量性是这么的有用。
把记录分页
带着这个背景,我决定尽可能地使所有结果集合的规模保持为最小值,因此在整个应用程序中我们都贯彻了分页的概念。我们的代码来自于主题为如何: 在.NET 应用程序中对记录进行分页一文提供的示例代码。
我们已经在这个如何让中扩充了示例代码,这样它就能适用于四种非常不同的情况:
•用于小列表的简单分页控件。小列表典型代表就是我们定义过的对每个公司所含条目数少于100行的列表。
•分页下拉组合框。当你使用下拉框,但由于下拉框所含条目数目可能超过100行,这样所包含的每条记录都会使页面变大并增加网络传输的开销,这时你就需要使用分页下拉组合框。
•有了分页,可使中到大型的列表(中等是指每个公司有100到1000行,1000以上为大型)拥有更加复杂的过滤搜索能力)—包括拥有数千万行的表。
•一个高级分页控件,它像一个浏览控件条一样,允许用户输入字符,并基于下拉框中指定的排序方法或选定项,来查找下一个匹配项。它使用了 XML HTTP 来回发页面的小数据集,并动态更新控件,而无需重画整个页面。
引人注目的是,我们的基础分页存储过程处理这四种情况都会花费异常的时间。这个存储过程来自于Microsoft 模式 &实践中的app_temp 这个例子 (这里我们已经扩充了这个例子,支持了升降排序,并可以用不同的搜索标准在不同的表上做相同的搜索)。
