1

VBA - Access を使用して多数の挿入操作を実行しています。VBA コードはファイル "control.accdb" 内にあり、"data.accdb" に対して操作を実行しています。プロセス内のいくつかのテーブルは VBA から作成され、そのまま残っているテーブルはほとんどありません。

プロセスのフェーズ 1 が終了したら、手動で、または DBEngine.Compact VBA コードから圧縮して修復します。2 番目のフェーズ (同じコード - 次の反復) は非常に遅くなります。

挿入コードは次のとおりです。

SQL = "INSERT INTO ExpectedResult " _
  & "( DLID, NumRows, Total, SubjectBlock, NextSubjectBlockSeq ) " _
  & "SELECT INVDL.DLID, 1 AS Expr1, INVDL.Amount, " _
  & "INVDL.SubjectBlock,INVDL.SubjectBlockSeq+1 AS Expr2 " _
  & "FROM INVDL where SubjectBlock > 0;"
cdb.Execute (SQL)
TargetNumRows = 2
Do While TargetNumRows < MaxSubjectBlockSeq + 1
    Set qdf = cdb.QueryDefs("pq_appendToExpectedResult")
    qdf!TargetNumRows = TargetNumRows  '' parameter value
    qdf.Execute
    TargetNumRows = TargetNumRows + 1
    Set qdf = Nothing
Loop

where pq_appendToExpectedResult :

PARAMETERS TargetNumRows Long;
INSERT INTO ExpectedResult _
  ( DLID, NumRows, Total, SubjectBlock, NextSubjectBlockSeq ) _
SELECT INVDL.DLID+1-[TargetNumRows], [TargetNumRows] AS Expr1, _
  [ExpectedResult].[Total]+[INVDL].[Amount] AS NewTotal, _
  INVDL.SubjectBlock, [INVDL].[SubjectBlockSeq]+1 AS Expr2 _
FROM INVDL INNER JOIN ExpectedResult _
   ON (INVDL.SubjectBlock = ExpectedResult.SubjectBlock)  _
   AND (INVDL.SubjectBlockSeq = ExpectedResult.NextSubjectBlockSeq) _
WHERE (((INVDL.SubjectBlockSeq)>=[TargetNumRows])  _
   AND (ExpectedResult.NumRows=[TargetNumRows]-1));

私の知る限り、INVDL のすべてのインデックスは変更されていません。テーブル ExpectedResult を削除し、各フェーズ (反復) 後にインデックスを使用して再作成します。他のテーブル - 違いはないと思います。

4

0 に答える 0