0

我正在尝试优化一小段代码,这些代码一遍又一遍地连接到我们的服务器。首先,这是代码补丁

Dim sale as Sale()
With sale
    If .CustomerID > 0 Then
        .CustomerName = CCCustomer.SelectByID(.CustomerID).FirstNameLastName
    Else
        .CustomerName = "Cash Sale"
    End If
End With

所以问题是,如果你有 50 个客户正在迭代,则需要很长时间才能通过数据,因为对于每个 customerID,你都必须访问 CCCustomer 对象,连接到数据库,找到customer by 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,而不是名称,但无论哪种方式,它仍然需要永远)

我能想到的唯一其他选择是完全重写多个存储过程并更新对象以仅在本机上保存客户名称和客户 ID,但我想我会在完全拆开其余部分之前先检查一下的程序。

那么,当您从数据库中提取数据时,有没有人知道一种为此类事情获得体面加载时间的好方法?

编辑:抱歉,这对我来说是一个糟糕的解释——它不是在迭代客户,而是在创建客户对象。所以如果你有这样的事情......

|  SaleID  |  CustId  |  ...  |
|    1     |    1     |  ...  |
|    2     |    1     |  ...  |
|    3     |    2     |  ...  |
|    4     |    1     |  ...  |
|    5     |    2     |  ...  |

然后它将使用 CCCustomer.SelectByID(1) 3 次 - 基本上创建客户对象 3 次只是为了获取 firstnamelastname 信息。

4

1 回答 1

1

最有效和最简单(不是最安全或可读)的方法是自己构建一个查询,将所有 Id 添加到单个 SQL 查询字符串“...(其中 id=12 或 id=44 或 id=77 等..)”,然后使用 runsql() 函数或您正在使用的系统中的任何等效函数将查询字符串传递给 db。如果您可以将收集 id 的逻辑放入查询本身,并且只需传递一个标准(如人名)来选择 ID,它会更快。

数据库在分析查询、遍历数据和填充表时会非常快。

或者,您可以使用 linq(即 linqtosql)来获得更好的可读性和安全性代码,具有一些值得但可比的性能。如果这不是一个选项,您还可以考虑将该功能放入数据库服务器存储过程中并使用参数(条件或 id 列表)调用该过程。

以现在的方式遍历 db 数据是可能的最低效的方式。我希望我提到的所有其他选项都快一到两个数量级。

于 2014-09-18T22:03:48.207 回答