• ベストアンサー

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
質問者

お礼

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

関連するQ&A

  • 【ADO】「Filter」を使うか「WHERE」を使うか

    こんばんは。 アクセス2003です。 「Filter」を使うか「WHERE」を使うかべきかわからないので教えてください。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Sub test1() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 rs.Open "SELECT * FROM Tテーブル WHERE 'フィールド1'='りんご", cn, adOpenKeyset, adLockOptimistic rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub Sub test2() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 rs.Open "SELECT * FROM Tテーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "フィールド1 = " & "'" & "りんご" & "'" rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 以上のふたつのステートメントは Tテーブルのフィールド1にりんごの文字が入力されているレコート゛を抽出します。 いくつかこのような動作をするプログラムを書くのですが どちらのほうがコート゛として適していますか? WHEREを使うtest1の方がコート゛が短くなるからいいのでしょうか? というのもいつかこのファイルを引き継ぐので他人が見てもわかりやすくしたいです。 よろしくお願い致します。

  • WHERE レコードが抽出されない

    ADOでSQL文を作ってるのですが WHERE句がうまくできません。 rs.Open "T_テーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "URL like '#*'" なら、うまくいくのですが、 Filterを使うのをやめて、WHEREに書きかえると、エラーにはならないのですが 取得レコードが0件になります。 rs.Open "T_テーブル WHERE [URL] like '#*';", cn, adOpenKeyset, adLockOptimistic も rs.Open "T_テーブル WHERE URL like '#*';", cn, adOpenKeyset, adLockOptimistic も、0件が返ります。 何がおかしいのでしょうか? URLフィールドで、#で始まるレコードを抽出したいです。

  • ADO WHERE句でエラーになる

    アクセス2003です。 ADOを使ってテーブル1の済「 (Yes/No型) 」に rs.Open "テーブル1 WHERE 済=True", cn, adOpenStatic, adLockPessimistic と言う風にフィルタをかけたいのですが 「キーワードWHERE''付近意不適切な構文があります。」 というエラーがでてしまいます。 どこか文法がおかしいでしょうか?よろしくお願いします。

  • adoでBetween は使えないのでしょうか?

    ADOで期間で抽出したいのですが rs.Open strテーブル, cn, adOpenStatic, adLockPessimistic rs.Filter = "計上日 = #2015/01/01#" は問題なく通るのですが、 rs.Open strテーブル, cn, adOpenStatic, adLockPessimistic rs.Filter = "計上日 Between #2015/01/01# And #2015/01/31#" だと 実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 と言うエラーになります。 adoでBetween は使えないのでしょうか?

  • WHERE句だと抽出できない VBA ADO

    アクセスのADOについて質問があります。 SQL文の中でWHERE句を使ってフィルタをすると返り値が0件になるのに、 rs.Open strSQLした後に、 rs.Filterで抽出すると、適切な数値が返ります。 具体的に言うと 【1】 strSQL = "SELECT T_会社名.*, T_会社名.住所 FROM T_会社名 WHERE (((T_会社名.住所) Like ""*埼玉*""));" rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic i = rs.RecordCount 【2】 strSQL = "SELECT T_会社名.*, T_会社名.住所 FROM T_会社名;" rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic rs.Filter = "T_会社名.住所 like '%埼玉%'" i = rs.RecordCount だと、【2】が、適切な数値が返ります。 なぜ【1】はダメなのでしょうか?

  • ワイルドカード 「Not like」

    エクセルからアクセスへADOで接続しているのですが RS.Open "Tテーブル", CN, adOpenStatic, adLockOptimistic RS.Filter = "タイトル Like '%ヒットしたくない文字%'" なら問題なく行くのですが RS.Filter = "タイトル not Like '%ヒットしたくない文字%'" や RS.Filter <> "タイトル Like '%ヒットしたくない文字%'" にするとエラーになります。 (競合しています、コンパイルエラー) どうすれば、「含まない」ができるのでしょうか? アドバイス宜しくお願い致します。

  • ADOで現在のレコードの次のレコードの値も取得

    ADOで現在のレコードの次のレコードの値も取得するには? アクセスに対してADOでデータを取得しているのですが 例えばテーブルに フィールド1 あああ いいい ううう と入ってる時に、1レコード目のあああの値を取得しているときに、同時に次のレコードのいいいの値も取得することは可能ですか? Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "SELECT * FROM テーブル1", cn, adOpenStatic, adLockPessimistic For i = 1 To rs.RecordCount MsgBox rs("フィールド1") '現在のレコード MsgBox rs("フィールド1") + 1 '次のレコード rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これだとダメなようです。 あああ いいい が表示されるようにしたいのですが、どうすればいいか教えてください。

  • 「オブジェクトが開いている場合は操作は許可され

    vbaループしながらマクロを実行しているのですが、 2度目のループで rs.Open "SELECT * FROM T明細", cn, adOpenStatic, adLockOptimistic の場所で 「オブジェクトが開いている場合は操作は許可されません」 となってしまいます。 エラーになって中断中に rs.Open "SELECT * FROM T明細", cn, adOpenStatic, adLockOptimistic の一つ前に、rs.Closeを入れて、 rs.Close rs.Open "SELECT * FROM T明細", cn, adOpenStatic, adLockOptimistic としてみましたが、 rs.Close の部分で 実行時エラー 3219 このコンテキストで操作は許可されていません。 となります。 マクロを停止せず、コードを修正して続行する方法と エラー発生の原因を教えてください。

  • 数値のMAXの値を取得したい ADO VBA

    アクセスです。 ADOで該当のフィールドの数値のMAXの値を取得するにはどうすればいいですか? テーブルの番号フィールドには、 1 2 3 4 5 と入っているのですが、 この場合、一番大きい値は5なので MAX関数のようなもので5を返したいのですが ADOにそのようなプロパティはありますか? オブジェクトブラウザーでRecordsetを見てみましたが 見つけられませんでした。 Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.CursorLocation = adUseClient rs.Open "SELECT * FROM T_test", cn, adOpenStatic, adLockPessimistic rs.Sort = "番号 DESC" Debug.Print rs("番号").Value rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これで同じような動きは出来ますが、 もっとシンプルにできませんか?

  • なぜSELECT文なのに終わりに「;」はいらないのですか?

    rs.Open "SELECT * FROM テーブル1", cn, adOpenKeyset, adLockOptimistic こののようにADOを使ってSQLを作成(?)しているのですが この場合 終わりに「;」をつけなくてもエラーになりません。 付けてもエラーになりません。 不要なのでしょうか?

専門家に質問してみよう