#26 アクションクエリーのトランザクションを考える

結論
アクションクエリーの「トランザクションの使用」プロパティは、デフォルトの"はい"のままで、特にその設定を気にする必要はない。

VBAを使ったデータアクセスにおけるトランザクション処理については、このAccess Laboでもすでに取り上げています(#09参照)。しかし、トランザクション処理は、アクションクエリーにも用意されています。クエリーの「トランザクションの使用」というプロパティがそれです。デフォルトでは"はい"、トランザクションを使用するという設定になっています。つまり、データ処理の安全性を優先した設定になっているわけです。

データアクセスの最適化というと、テーブル構造やキー設定、VBAのコーディングなどに目が向きがちですが、このようなプロパティ設定1つでも、パフォーマンスが変わる可能性があります。ここでは、このプロパティの"はい"・"いいえ"が、アクションクエリーの実行時間にどれだけ影響を与えるか、実際に比較、検証してみたいと思います。

テスト内容は簡単なものです。まず、5000件のレコードを持ったテーブルを用意します。その全レコードのある1つのフィールドの値を更新するクエリー、全レコードをそっくり別のテーブルに追加するクエリー、全レコードを削除するクエリーの3つのクエリーを用意します。これらのクエリーの「トランザクションの使用」プロパティは、デフォルトの"はい"に設定されています。そして、これらをコピーし、「トランザクションの使用」プロパティを"いいえ"にすることによって、合計6ケのクエリーを作ります。あとは、それらを順番に実行し、それぞれの実行時間を測定します。

テストパターン

トランザクション使用 トランザクション不使用
更新クエリー
追加クエリー
削除クエリー


テストに使うコードは次のようなものです。DoCmd.OpenQuery の行の右に書かれた番号が、テストパターンの各番号を表しています。

Sub TestQryTransaction()

  DoCmd.SetWarnings False
  ts_Watch "テスト開始", True

  'トランザクションを使用する場合のテスト
  DoCmd.OpenQuery "更新クエリ_デフォルト"・・・・・・1
    ts_Watch "トランザクション使用 更新"
  DoCmd.OpenQuery "追加クエリ_デフォルト"・・・・・・2
    ts_Watch "トランザクション使用 追加"
  DoCmd.OpenQuery "削除クエリ_デフォルト"・・・・・・3
    ts_Watch "トランザクション使用 削除"

  'トランザクションを使用しない場合のテスト
  DoCmd.OpenQuery "更新クエリ_トランなし"・・・・・・4
    ts_Watch "トランザクション不使用 更新"
  DoCmd.OpenQuery "追加クエリ_トランなし"・・・・・・5
    ts_Watch "トランザクション不使用 追加"
  DoCmd.OpenQuery "削除クエリ_トランなし"・・・・・・6
    ts_Watch "トランザクション不使用 削除"

  DoCmd.SetWarnings True

End Sub



テスト結果は次の通りです。

トランザクション使用 トランザクション不使用
更新クエリー 0.66 0.97
追加クエリー 2.99 3.24
削除クエリー 0.70 0.68

削除クエリーでは、トランザクションを使わないことによって若干処理時間が短くなっていますが、おおむね、VBAにおけるトランザクション処理と同様、アクションクエリーでも、トランザクションを使うことによってパフォーマンスが向上するということが分かりました。しかし、VBAの場合は、トランザクションを意識してコーディングしなければなりませんが、クエリーの場合にはトランザクションを使うという設定がデフォルトになっていますので、逆に「この設定を変更するとパフォーマンスが落ちる」という言い方もできると思います。つまり、アクションクエリーの「トランザクションの使用」プロパティは特に気にする必要はないといってもいいかもしれません。

ただ、今回の結果で、削除クエリーの場合にはトランザクションを使わない方が処理時間が小さくなっていることを考えると、処理対象とするテーブルのレコード数、キー設定などのテーブル構造、あるいはWHERE条件などによって、トランザクションの効果が変わらないとは言い切れないかもしれません。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved