SQL文とパラメータクエリはどちらが早いか計測

Accessで作成したパラメータクエリとSQLのSELECT文で抽出した場合、どちらが早いか時間計測をしてみます。


Homeに戻る > Excel データベースのTipsへ

実行画面

20000件の顧客テーブルを使用しました。

パラメータクエリの時間計測結果です。
Accessクエリで時間計測

SQLでの時間計測結果です。
SELECT文で時間計測

4回計測した結果です。クエリの方が若干早そうですが、それほど差はありませんでした。
クエリ 、 SQL
0.578 、 0.561
0.546 、 0.577
0.515 、 0.609
0.530 、 0.608

コード

Option Explicit

'Windowsが起動してからの経過時間 API
Private Declare Function GetTickCount Lib "kernel32" () As Long

'クエリで抽出
Private Sub ExAccdbQueryImport()
    Dim db As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim st As Long
    Dim et As Long
        
    '開始時間を取得
    st = GetTickCount
        
    '顧客管理のACCDBファイルに接続します
    Set db = New ADODB.Connection
    db.Provider = "Microsoft.Ace.OLEDB.12.0"
    db.Open "C:\MyHP\excel2007\Tips\顧客管理.accdb"

    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = db

    cmd.CommandText = "Q_顧客抽出"

    'レコードセットを開きます
    Set rs = New ADODB.Recordset
    '氏名に田、住所に文京がつくレコードを抽出
    Set rs = cmd.Execute(Parameters:=Array("田", "文京"))
    
    If rs.EOF Then
        MsgBox "抽出した結果、顧客のレコードが見つかりません。"
    Else
        'レコードをシートへ貼り付ける
        Range("B7").CopyFromRecordset rs
    End If
    
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    
    DoEvents
    
    '終了時間を取得
    et = GetTickCount
    MsgBox "パラメータクエリ:" & (et - st) / 1000 & " 秒"
End Sub

'SQLで抽出
Private Sub ExAccdbSqlImport()
    Dim db As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim SQL As String
    Dim st As Long
    Dim et As Long
        
    '開始時間を取得
    st = GetTickCount
    
    '氏名に田、住所に文京が含まれる
    SQL = "SELECT * FROM T_顧客マスター20000件 WHERE 顧客名 LIKE '%田%' AND 住所 LIKE '%文京%'"
        
    '顧客管理のACCDBファイルに接続します
    Set db = New ADODB.Connection
    db.Provider = "Microsoft.Ace.OLEDB.12.0"
    db.Open "C:\MyHP\excel2007\Tips\顧客管理.accdb"

    'レコードセットを開きます
    Set rs = New ADODB.Recordset
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = db
    'SQLをセット
    cmd.CommandText = SQL
    Set rs = cmd.Execute
    
    If rs.EOF Then
        MsgBox "抽出した結果、顧客のレコードが見つかりません。"
    Else
        'レコードをシートへ貼り付ける
        Range("B7").CopyFromRecordset rs
    End If
    
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    
    DoEvents
    
    '終了時間を取得
    et = GetTickCount
    MsgBox "SQL:" & (et - st) / 1000 & " 秒"
End Sub

Private Sub CommandButton1_Click()
    ExAccdbQueryImport
    ExAccdbSqlImport
End Sub



Homeに戻る > Excel データベースのTipsへ

■■■
このサイトの内容を利用して発生した、いかなる問題にも一切責任は負いませんのでご了承下さい
■■■
当ホームページに掲載されているあらゆる内容の無許可転載・転用を禁止します


Copyright (c) Excel-Excel ! All rights reserved