2011/08/28

access2010 遅いのではないのか? -7-

SQL Azureから1,000,000レコードをダウンロードしてローカルテーブルへ追加していたとき。
そういえば、トランザクション使うことでパフォーマンスがあがったっけなと使ってみたのだけど、どの程度効果があるのか改めて確認してみた。最近のH/Wのスペックはかなりよいはずから気にすることもないのかなと思っていたけど、思いのほか効果はあるようだ。

Option Compare Database
Option Explicit

Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long

Sub testLoop()
    Dim i As Integer, s As Long, l As Long
    For i = 1 To 10
        l = testInsert
        Debug.Print i & "回目:" & Format(l, "#,##0ms")
        s = s + l
    Next
    Debug.Print "-----------------------------"
    Debug.Print "平均:" & Format(s / 10, "#,##0ms")
End Sub

Function testInsert() As Long
    Dim db As DAO.Database, ws As DAO.Workspace, rs As DAO.Recordset
    Dim i As Long, pTime As Long
    Set ws = DBEngine(0)
    Set db = CurrentDb
    pTime = timeGetTime
    ws.BeginTrans '<-----------これ
        Set rs = db.OpenRecordset("table01")
        For i = 1 To 10000
            rs.AddNew
            rs!F01 = i
            rs.Update
        Next
    ws.CommitTrans '<-----------これ
    testInsert = timeGetTime - pTime
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
    ws.Close: Set ws = Nothing
End Function
トランザクションあり
1回目:174ms
2回目:78ms
3回目:74ms
4回目:76ms
5回目:76ms
6回目:75ms
7回目:76ms
8回目:75ms
9回目:76ms
10回目:77ms
-----------------------------
平均:86ms
トランザクションなし
1回目:762ms
2回目:698ms
3回目:699ms
4回目:709ms
5回目:725ms
6回目:724ms
7回目:722ms
8回目:712ms
9回目:720ms
10回目:708ms
-----------------------------
平均:718ms
思いのほか差がついた。ここまで差がつくのはAddNewだけなのだけど、Edit/Deleteでも詳細まで確認していないが10~30%ほど差が出る。access2007でも同じ傾向だけれどもaccess2010よりも速いみたい。
今回はWin7で確認したのけど、XP/Vistaだとどうだろか。

0 件のコメント: