Accessのデータベースが「重い」原因はこれだ!QueryDefを使い捨てにするメモリ管理術
Accessで開発をしていると、いつの間にかデータベースファイル(.accdb)が肥大化し、動作がもっさりとしてきた経験はありませんか?
その原因の多くは、「クエリを保存しすぎていること」にあります。
画面の裏でクエリを1つ作るたびに、Accessは内部的に「QueryDef」というオブジェクトをデータベースファイル内に書き込みます。これを繰り返すと、ファイルサイズは膨らみ、最適化の頻度も増え、パフォーマンスは低下の一途をたどります。
今日は、「必要な時だけクエリを作り、終わったら即座に消去する」という、プロの現場で必須のメモリ管理術を伝授します。
—
そもそもQueryDefって何者?
Accessの「クエリデザイン」画面で作るクエリは、保存すると「永続的なQueryDef」としてデータベースの一部になります。しかし、VBAでSQLを組み立てて実行する場合、わざわざ保存する必要はありません。
「一時的なQueryDef」を使えば、メモリ上でクエリを実行し、処理が終われば消し去ることができます。これにより、ファイルサイズを増やさずに、動的なSQL(条件によって変わるSQL)を安全かつ高速に実行できるのです。
—
現場で使える「使い捨てQueryDef」の設計パターン
では、実際のコードを見てみましょう。ポイントは「作成(CreateQueryDef)」して「実行」したら、すぐに「削除(Delete)」することです。
Public Sub ExecuteDynamicQuery()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Dim userID As Long
‘ 1. 現在のデータベースオブジェクトを取得
Set db = CurrentDb
‘ 2. 動的なSQLを生成(例: 特定のユーザーのデータを抽出)
userID = 101
strSQL = “SELECT FROM T_Orders WHERE UserID = ” & userID
‘ 3. 一時的なQueryDefを作成(名前を空文字””にすると一時オブジェクトになる)
‘ 名前を付けないことで、データベースウィンドウを汚さずメモリ上で完結します
Set qdf = db.CreateQueryDef(“”, strSQL)
‘ 4. クエリを実行(レコードセットを開く例)
Dim rs As DAO.Recordset
Set rs = qdf.OpenRecordset(dbOpenSnapshot)
‘ — ここでデータを加工したり処理したりする —
Debug.Print “レコード件数: ” & rs.RecordCount
‘ 5. 終了処理(非常に重要!)
rs.Close
qdf.Close
‘ オブジェクトの解放
Set rs = Nothing
Set qdf = Nothing
Set db = Nothing
End Sub
このコードの「賢いポイント」
- `db.CreateQueryDef(“”, strSQL)`: 第一引数を空文字 `””` にするのが最大のコツです。これにより、Accessは「これは永続保存しない一時的なクエリだ」と理解し、メモリ上で処理を行います。
- ゴミを残さない: 明示的に `qdf.Close` を呼び出し、メモリを解放しています。これにより、PCのメモリを無駄に占有しません。
—
初学者が陥りやすいエラーとその対策
1. 名前を付けて保存しようとしてしまう
「`db.CreateQueryDef(“TempQuery”, strSQL)`」のように名前を付けてしまうと、同名のクエリが既に存在する場合に「名前が重複しています」というエラーが発生します。一時利用なら必ず名前は `””`(空文字)にしましょう。
2. オブジェクトの解放忘れ
`Set qdf = Nothing` を忘れると、VBAのメモリ管理が追いつかず、複雑な処理を繰り返した際に「システムリソース不足」に陥ることがあります。「作ったら消す」は、プログラミングの鉄則です。
3. パラメータの注入によるSQLインジェクション
上記の例では数値をそのまま代入していますが、文字列を扱う場合は注意が必要です。動的SQLを組む際は、可能な限りパラメータクエリ(`Parameters`コレクション)を使用することをおすすめします。
—
まとめ:Accessを「軽く」使いこなすために
今回ご紹介した「一時的なQueryDef」の手法は、Accessのパフォーマンスを維持する上で非常に強力な武器になります。
- 保存するクエリは、再利用するものだけにする
- 使い捨てのSQLは、メモリ上で完結させる
- `Close`と`Nothing`をセットで書く習慣をつける
この3つを意識するだけで、あなたのAccessアプリは驚くほど軽快で、堅牢なものに生まれ変わります。ここをクリアすれば、あなたはもう脱・初心者です。さあ、自信を持って次のコードを書き進めてください!
何か不明点や、「こんなSQLの動的生成で詰まっている」という悩みがあれば、いつでも相談してくださいね。応援しています!
