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 件のコメント:
コメントを投稿