我正在尝试优化一小块代码,这些代码一遍又一遍地连接到我们的服务器。首先,这里是代码的补丁
Dim sale as Sale()
With sale
If .CustomerID > 0 Then
.CustomerName = CCCustomer.SelectByID(.CustomerID).FirstNameLastName
Else
.CustomerName = "Cash Sale"
End If
End With
因此,问题是,如果你有,比如说50个客户,这需要很长时间才能遍历数据,对于每个客户ID,你只需要访问CCCustomer对象,连接到数据库,按ID找到客户,然后从对象中选择FirstNameLastName。
我的第一个想法是立即提取所有客户的列表或数组,然后根据ID进行匹配,但这似乎需要更长的
Dim sale as Sale()
With sale
Dim allCustomers() = CCCustomer.SelectAll
If .CustomerID > 0 Then
.CustomerName = Array.FindIndex(allCustomers, Function(c) c.CustomerID = .CustomerID)
Else
.CustomerName = "Cash Sale"
End If
End With
(这段代码返回的是customerId,而不是名称,但无论哪种方式,它都需要很长时间)
我唯一能想到的另一个选项是完全重写多个存储过程,并更新对象以仅本地保存客户名称和customerID,但我想我应该在完全分解程序的其余部分之前进行检查。
那么,当你从数据库中提取数据时,有人知道一个好的方法来为这样的东西获得一个合适的加载时间吗?
编辑:很抱歉,这对我来说是一个糟糕的解释——它不是在迭代客户,而是在创建客户对象。所以,如果你有这样的东西。。。。
| SaleID | CustId | ... |
| 1 | 1 | ... |
| 2 | 1 | ... |
| 3 | 2 | ... |
| 4 | 1 | ... |
| 5 | 2 | ... |
然后它将使用CCCustomer.SelectByID(1)3次-基本上创建客户对象3次JUST以获得firstnameastname信息。
最有效、最简单(不是最安全或可读的)的方法是自己构造一个查询,将所有id添加到一个SQL查询字符串"…(其中id=12或id=44或id=77等)"中,然后使用runsql()函数或您正在使用的系统中的任何等效函数将查询字符串传递给db。如果您可以将收集ID的逻辑放入查询本身,并只传递一个条件(如人名)来选择ID,那么速度会更快。
数据库在分析查询、遍历数据和填充表方面将非常快速。
或者,您可以使用linq(即linqtosql)来获得更好的可读性和安全性代码,具有一定的价值,但性能相当。如果这不是一个选项,您还可以考虑将该功能放入数据库服务器存储过程中,并使用参数(criteria或id列表)调用该过程。
以现在的方式迭代数据库数据是最低效的方法。我预计我提到的所有其他选择都会快一到两个数量级。