以非常慢的完成消除Do..Until循环

时间:2018-02-03 04:45:38

标签: sql-server-2008 vb6

我需要一个重要的帮助。  我有一个已经存在超过7年的VB6应用程序,我有几个客户使用它作为他们的会计解决方案。现在我的问题是一个特定的客户端已经变得如此庞大,数据库大小为15GB,分类帐数据库表超过400万行,客户大小超过100,000,ETC。

我在该应用程序中有一个代码,客户在检查一些参数后以固定费率借记,对于具有小型或普通数据库的客户端,它工作得很好,但是对于这个特定客户端,此代码有时不会甚至在6小时内完成,它变得非常头疼,我需要帮助!

代码看起来像这样.......

Select * from table Customers order by account number
do until rst.eof

   select * from table purchase where account number = rst!account number
   if found 
   A1 = "YES"
   else
   A1 = "NO"

   A2 = new charges on form / 100
   A3 = rst!Balance + A2

   select count(*) from table receipts where account number = rst!account number and month = currentmonth and year = current year
   if count > 10 then
   goto VBSTOP
   else
   CONTINUE

   select * from table seller where account number = rst!account number
   if found 
   A4 = "YES"
   else
   A4 = "NO"

insert into table ledger (Account number, Account name, A1, A3, A4, Charges)
insert into table Charges (Account number, Account name, Charges)
insert into table Receipts (Account number, Account name, Charges, Receipt Number)
update table purchase (update purchaseno = purchaseno + 1 where account number = rst!account number

rst.MoveNext
loop

............................................... .................................................. ..........

这个代码需要6个多小时才能完成,因为客户端拥有一个非常大的数据库,我真诚地寻求帮助来解决我的DO .... UNTIL循环问题。有没有办法优化这些代码并消除do until语句或使其运行速度非常快?

我衷心感谢所有帮助。

1 个答案:

答案 0 :(得分:4)

几点建议:

  • 而不是选择*,只选择您需要的列。这将减少记录集的大小。
  • 确保将where子句中使用的所有列编入索引 (帐户,月,年)。
  • 将3个插入和更新转换为单个存储过程 调用
  • 如果您正在检查是否存在记录,请尝试 “选择TOP 1”,然后选择主键的列名。
  • 在调试中运行它以查看哪个步骤花费的时间最长。

我没有代码给你。我本来会评论,但我没有获得这种特权。