#23 DAOとADOを比較する

結論
MDBファイルでデータベースを構築する場合、データアクセスの実行時間の観点からはDAOの方がほんのわずかであるが優位である。

Access2000から、Accessの扱うデータベースの形式が2つになりました。従来からあったMDBファイルと新しいADPファイルです。また、これに対応した形でデータアクセスの方法も従来のDAO(Data Access Object)に加えてADO(Microsoft ActiveX Data Objects)が本格的に加わることとなりました。SQL Serverのようなサーバーベースのデータベースをバックエンドとして扱う場合、ADPでAccessのデータベースを構築することによって従来の開発環境にはなかったさまざまな恩恵を得ることができます。しかし、かといって従来のODBC経由のリンクテーブルへのアクセスやパススルークエリー、ODBC Directを使ったストアドプロシージャの実行などがMDBファイルでできなくなったわけではありません。また、ADOによるローカルのMDBファイルに対するアクセスも可能です。これらのことは開発者にとって選択肢が広がったといえる反面、開発するデータベースによってはいったいどれを使うべきか迷うことが増えたともいえるでしょう。クライアントサーバー環境ならADP+ADOという選択を簡単に導き出すことができるかもしれませんが、ローカルのMDBファイルを使ったデータベースを作ろうという場合にはいったい何を根拠にDAO/ADOを選択すればよいのでしょうか?。DAOは歴史も古くAccessネイティブなオブジェクトであることから、Accessでの安定した動作を期待できますし、ADOはこれからのオブジェクトですので、将来に渡ってもプログラムがそのまま使えるという可能性を持っています。それぞれ一長一短あるので、なかなか難しい選択です。

そこで、それぞれの特性を判断するにはあまりにも簡単で部分的な実験かもしれませんが、多少は選択の手助けになるかもしれないと思い、テーブルに対するレコードの追加・選択・更新・削除に関してその実行時間を比較してみることにしました。なお、ここではDAOもADOもあくまでローカルのMDBファイルが対象です。データベースには動作環境や条件によってさまざまな要件がありますので、これ以外にもいろいろ試した上でDAOとADOどちらにするかを決定した方がよいということをあらかじめ付け加えておきます。

今回のテストで使ったコードはDAO/ADOそれぞれ次のようなものです。ADOの場合には、テーブル1つにアクセスするにもさまざまなオブジェクトやメソッド・プロパティの使い方がありますが(特にレコードセットを開くまで)、今回はその中の1つだけについてテストを行ってみます。


【DAOのテストコード】

Dim dbs As Database
Dim rst As DAO.Recordset
Dim ilngLoop As Long
Dim varDummy As Variant
Const clngRecMax As Long = 10000

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tblTest")
  
ts_watch "テスト開始", True
'レコードを追加
For ilngLoop = 1 To clngRecMax
  With rst
    .AddNew
      !Data1 = ilngLoop
      !Data2 = ilngLoop * 2
      !Data3 = "ABC"
      !Data4 = "EFG"
    .Update
  End With
Next ilngLoop
ts_watch "レコード追加"
  
'レコード読み込み
rst.MoveFirst
For ilngLoop = 1 To clngRecMax
  With rst
    varDummy = !Data1
    varDummy = !Data2
    varDummy = !Data3
    varDummy = !Data4
    .MoveNext
  End With
Next ilngLoop
ts_watch "レコード読み込み"
  
'レコード更新
rst.MoveFirst
For ilngLoop = 1 To clngRecMax
  With rst
    .Edit
      !Data2 = ilngLoop * 3
      !Data3 = "HIJK"
      !Data4 = "LMN"
    .Update
    .MoveNext
  End With
Next ilngLoop
ts_watch "レコード更新"
  
'レコード削除
rst.MoveFirst
For ilngLoop = 1 To clngRecMax
  With rst
    .Delete
    .MoveNext
  End With
Next ilngLoop
ts_watch "レコード削除"

rst.Close
dbs.Close



【ADOのテストコード】

Dim cn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ilngLoop As Long
Dim varDummy As Variant
Const clngRecMax As Long = 10000

Set cn = CurrentProject.Connection
rst.Open "tblTest", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
  
ts_watch "テスト開始", True
'レコードを追加
For ilngLoop = 1 To clngRecMax
  With rst
    .AddNew
      !Data1 = ilngLoop
      !Data2 = ilngLoop * 2
      !Data3 = "ABC"
      !Data4 = "EFG"
    .Update
  End With
Next ilngLoop
ts_watch "レコード追加"
  
'レコード読み込み
rst.MoveFirst
For ilngLoop = 1 To clngRecMax
  With rst
    varDummy = !Data1
    varDummy = !Data2
    varDummy = !Data3
    varDummy = !Data4
    .MoveNext
  End With
Next ilngLoop
ts_watch "レコード読み込み"
  
'レコード更新
rst.MoveFirst
For ilngLoop = 1 To clngRecMax
  With rst
    !Data2 = ilngLoop * 3
    !Data3 = "HIJK"
    !Data4 = "LMN"
    .MoveNext
  End With
Next ilngLoop
ts_watch "レコード更新"
  
'レコード削除
rst.MoveFirst
For ilngLoop = 1 To clngRecMax
  With rst
    .Delete
    .MoveNext
  End With
Next ilngLoop
ts_watch "レコード削除"

rst.Close
Set rst = Nothing
cn.Close
Set cn = Nothing



テスト結果は次の通りです。
DAO ADO
追加 30.1 33.6
読み込み 5.4 3.2
更新 53.3 53.1
削除 68.4 84.3
テスト項目ごとにかなり微妙な違いが出ています。レコードの追加ではDAOの方が高速ですが、読み込みではADOの方が高速です。レコードの更新処理については、ADOの場合はEditメソッドやUpdateメソッドを使う必要がないのでそれが何らかの影響を与えるのではないかと考えましたが、ほとんど同じ時間で結果的には関係なかったようです。レコード削除については比較的大きな違いが現れています。DAOの方がかなり高速であることが分かります。

両者に極端な差が出ているわけではないので優劣をつけるのは難しいところですが、全体的にはDAOの方が若干優位なようです。古株となったしまったDAOですが、少なくてもMDBファイルとしてローカルで使う限りにおいては、あわててADOを導入する必要もなさそうです。特にそのような環境で使っているAccess97のデータベースをAccess2000に更新しようとする場合、これといった機能アップを行わないのであれば、データアクセスの部分だけに時間を掛けてADOに書き換えるメリットはまったくないといえるでしょう。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved