1.定義域集計関数
DSum,DAvg,DMin,DMax,DCount,DLookupなどのこと。
よく動作が遅いといわれる関数。
2.どのくらい遅いのか
①DLookup、②DLookupと同じ動作をする関数、③SQLで取得するの3パターンで比較した結果が
それぞれ、28.8秒、34.3秒、18.1秒という表があった。
これは、同じデータを1万回ループで取得した結果。
3.DLookupと同じ動作をする関数がなぜSQLで取得するより遅いのか
DLookupと同じ動作をする関数を自作した時に、中に記述されたSQLは同じもの。
この実験をしたソースコードを確認すると、
Sub Test()
Dim dbs As Database
Dim rst As Recordset
Dim strSQL As String
Dim lngID As Long
Dim iintLoop As Integer
Set dbs = CurrentDb
①For iintLoop = 1 To 10000
lngID = DLookup("顧客ID", "顧客マスタ", "会社名='日本商事'")
Next iintLoop
②For iintLoop = 1 To 10000
lngID = DLookupTest()
Next iintLoop
③strSQL = "SELECT 顧客ID FROM 顧客マスタ WHERE 会社名='日本商事'"
For iintLoop = 1 To 10000
Set rst = dbs.OpenRecordset(strSQL)
lngID = rst!顧客ID
rst.Close
Next iintLoop
End Sub
Function DLookupTest() As Long
Dim dbs As Database
Dim rst As Recordset
Dim strSQL As String
Set dbs = CurrentDb
strSQL = "SELECT 顧客ID FROM 顧客マスタ WHERE 会社名='日本商事'"
Set rst = dbs.OpenRecordset(strSQL)
DLookupTest = rst!顧客ID
rst.Close
End Function
このようなソースコードになっていた。
②で使用する関数は、ループ内でDatabaseオブジェクトを毎回作成しているので、
この部分で遅くなっている。
●Databaseオブジェクトを使いまわせるならSQLで記述したほうが早く取得でき、
毎回Databaseオブジェクトが必要なら定義域集計関数を使用したほうが早く取得できる。


コメント