• ベストアンサー

WHERE と Filter

アクセスのADOで rs.Open "SELECT * FROM テーブル1 WHERE フィールド1=あ", cn, adOpenStatic, adLockOptimistic とするのと、 rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic rs.Filter = "フィールド1゛ = 'あ'" とするのでは、 どちらの方が処理速度が速いですか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

自分で調べてみませんか? こんな風に百万レコードの検証用のを作って (標準モジュールです。ダミーデータを作るのにDAOへの参照設定が必要) Option Compare Database Option Explicit Private Declare Function GetTickCount Lib "kernel32" () As Long Sub makeDummy() Dim db As Database Dim Rs As DAO.Recordset Dim i As Long, j As Long Dim v As String, T As Single T = Timer Set db = CurrentDb db.Execute "create table NewT (FF1 long,FF2 text(5))", dbFailOnError db.TableDefs.Refresh Application.RefreshDatabaseWindow Set Rs = db.OpenRecordset("NewT") For i = 1 To 1000000 v = "" For j = 1 To 3 v = v & Chr(Int(Rnd * 26) + 65) Next j Rs.AddNew Rs!FF1 = i Rs!FF2 = v Rs.Update If i Mod 10000 = 0 Then Debug.Print i DoEvents End If Next MsgBox Timer - T & " done" End Sub で出来たら Sub Whereだと() Dim Cn As ADODB.Connection Dim Rs As ADODB.Recordset Dim sSql As String Dim T As Single T = GetTickCount sSql = "select * from NewT where FF2 ='abc'" Set Cn = CurrentProject.Connection Set Rs = New ADODB.Recordset Rs.CursorLocation = adUseClient Rs.Open sSql, Cn MsgBox Rs.RecordCount & " 個見つけるのに" & vbCrLf & GetTickCount - T & "ミリ秒" End Sub Sub Filterだと() Dim Cn As ADODB.Connection Dim Rs As ADODB.Recordset Dim sSql As String Dim T As Long T = GetTickCount sSql = "select * from NewT " Set Cn = CurrentProject.Connection Set Rs = New ADODB.Recordset Rs.CursorLocation = adUseClient Rs.Open sSql, Cn Rs.Filter = "FF2='abc'" MsgBox Rs.RecordCount & " 個見つけるのに" & vbCrLf & GetTickCount - T & "ミリ秒" End Sub みたいな感じで (きちんと作ってはいませんが検証用には十分かと) FF2にインデックスを設定した場合とか部分一致の場合とか色々試してみませう。

gjftzwareodv
質問者

お礼

ありがとうございました。