こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

WHERE と Filter

アクセスのADOで

rs.Open "SELECT * FROM テーブル1 WHERE フィールド1=あ", cn, adOpenStatic, adLockOptimistic
とするのと、

rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic
rs.Filter = "フィールド1゛ = 'あ'"

とするのでは、
どちらの方が処理速度が速いですか?

投稿日時 - 2016-03-26 09:19:27

QNo.9148884

暇なときに回答ください

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

自分で調べてみませんか?
こんな風に百万レコードの検証用のを作って
(標準モジュールです。ダミーデータを作るのに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にインデックスを設定した場合とか部分一致の場合とか色々試してみませう。

投稿日時 - 2016-03-27 01:10:58

お礼

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

投稿日時 - 2016-03-28 00:16:43

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)