3

私のコードは非常に頻繁にアクセスを照会したいので、すべての行に「for」を使用し、アクセステーブルに存在する場合はセルの値をチェックします。しかし、私はパフォーマンスが非常に悪いと感じています。現在、adodb.connection を使用してアクセスに接続しています。申し訳ありませんが、手元にないためコードを配置できません。Excel vbaから非常に頻繁にテーブルをクエリし、高速なパフォーマンスでテーブルをクエリする方法について、誰かが私を助けてくれますか?

編集:

For rowNum = 2 To 1000000

'check if title exists,if yes, get ppid, if not, insert one, get ppid, and make relation in r-table
    ppID = isTitleExistReturnID(ppTitle)
    If ppID = "0" Then
        ppID = addPpReturnID(ppTitle, ppDate, ppJournal)
        paperAddedCount = paperAddedCount + 1
        isPpAdded = True
    Else
        isPpAdded = False
    End If

Next rowNum


Function isTitleExistReturnID(title As String) As String
Dim r As New ADODB.Recordset
sqlstr = "select * from paper where title = '" & title & " '"
'MsgBox sqlstr
dbConnection.Open
r.Open sqlstr, dbConnection, adOpenKeyset, adLockOptimistic, adCmdText
If r.RecordCount < 1 Then
    dbConnection.Close
    isTitleExistReturnID = "0"
Else
    aidi = r.Fields(0).Value
    dbConnection.Close
    isTitleExistReturnID = aidi
End If
End Function

Function addPpReturnID(title As String, pubDate As String, journaL As String) As String
Dim r As New ADODB.Recordset
sqlstr = "select * from paper where (1=0)"
'MsgBox sqlstr
dbConnection.Open
r.Open sqlstr, dbConnection, adOpenKeyset, adLockOptimistic, adCmdText
r.AddNew
r.Fields(1) = title
r.Fields(2) = pubDate
r.Fields(3) = journaL
r.Update
maxid = CStr(r.Fields(0).Value)
dbConnection.Close
addPpReturnID = maxid
End Function

上記は私のコードの一部です:

  1. 項目がアクセス テーブルにあるかどうかを確認する
  2. YES の場合、その ID を返します
  3. NO の場合、この項目を追加して ID を返す

100,000回以上実行、非常に低いパフォーマンス

どんなアドバイスでも大歓迎です、事前に感謝します。

4

1 に答える 1

1

RBAR (row by agonizing row)アプローチは、パフォーマンスの課題になる可能性があります。

For rowNum = 2 To 1000000スプレッドシートの 100 万行 ( ) の行ごとに個別に処理を行うため、RBAR は間違いなく RBAR です。問題を複雑にしているのは、ADODB オブジェクト (接続とレコードセット) を少なくとも 1 回、場合によっては 2 回、これらの行ごとに開いたり閉じたりしているという事実です。

代わりに、セットベースのアプローチを見つけてみてください。たとえば、この操作を Access から実行できる場合は ...

  1. スプレッドシートへのリンクを作成します。
  2. ppTitleAccess の宛先テーブルに存在しないスプレッドシートの行を選択するには、"不一致" クエリを作成します (ガイドするクエリ ウィザードがあります) 。
  3. 「追加」クエリを作成して、これらの一致しない行を Access テーブルに追加します。

そのアウトラインがあなたの状況に適しているかどうか、または適応できるほど近いかどうかはわかりません. しかし、より重要な点は、RBAR の代わりにセットベースの方法を見つけることです。

于 2013-10-10T17:46:23.537 に答える