【入門編】【中級】テーブル内の不要なインデックスをVBAで検出し、書き込み速度を改善する – Access VBA解析バイブル

スポンサーリンク

Accessが「重い」と感じたらここを見ろ!不要なインデックスをVBAで一掃する極意

こんにちは。現場でAccessをこねくり回していると、必ずぶち当たる壁があります。そう、「データベースの肥大化と書き込み速度の低下」です。

長年運用されたAccessファイルは、まるで不用品を溜め込んだ屋根裏部屋のよう。特に犯人になりやすいのが、「使われていないインデックス」です。

今日は、Access VBAを駆使して「どのインデックスが足かせになっているのか」を可視化し、あなたのデータベースを軽量化するプロフェッショナルの手法を伝授します。マクロの記録から一歩踏み出し、エンジニアの視点でAccessを操りましょう!

—

なぜ「インデックス」が速度を落とすのか?

インデックスは、辞書の索引のようなものです。検索を爆速にしてくれる魔法のツールですが、書き込み(追加・更新・削除)のたびに、その索引を逐一更新しなければならないという「重い代償」を伴います。

  • 読み取り: インデックスがあると速い!
  • 書き込み: インデックスが多いと、更新作業が遅くなる!

「とりあえず全部の列にインデックスを貼っておこう」という開発初期の油断が、数年後に致命的な遅延を生むのです。

—

不要なインデックスを診断するロジック

VBAを使って、テーブルに定義されているインデックス情報を「カタログ」として取得します。今回は、システムテーブルの深淵を覗く `TableDef` オブジェクトと `Index` オブジェクトを活用します。

診断スクリプト:Index Auditor

このコードを標準モジュールに貼り付けて実行してみてください。イミディエイトウィンドウ(Ctrl + G)に、あなたのテーブルのインデックス状況がリストアップされます。

‘ 必要な参照設定: Microsoft Office 16.0 Access database engine Object Library
Sub AuditTableIndexes()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim idx As DAO.Index
Dim fld As DAO.Field

Set db = CurrentDb

Debug.Print “— インデックス診断レポート —”

For Each tdf In db.TableDefs
‘ システムテーブル(MSys…)は除外
If Left(tdf.Name, 4) <> “MSys” Then

For Each idx In tdf.Indexes
‘ 主キーは削除すべきではないので除外
If Not idx.Primary Then
Debug.Print “テーブル: ” & tdf.Name & ” | インデックス名: ” & idx.Name

‘ インデックスに含まれるフィールドを表示
For Each fld In idx.Fields
Debug.Print ” -> フィールド: ” & fld.Name
Next fld
End If
Next idx
End If
Next tdf

Debug.Print “— 診断終了 —”
End Sub

コードの解説

1. `CurrentDb.TableDefs`: データベース内の全テーブル定義にアクセスする入り口です。
2. `idx.Primary`: 主キー(Primary Key)はDBの整合性の要です。これを消すとアプリが崩壊するので、必ずスキップするようにします。
3. `Left(tdf.Name, 4) <> “MSys”`: Accessが内部で使うシステムテーブルに触れるのは厳禁。これを除外するのが安全なエンジニアの鉄則です。

—

よくある失敗と回避策

1. 「インデックスを消したのに遅い!」

インデックスを消しても、Accessは古いデータを完全には消去せず、ファイルサイズがそのまま残ることがあります。

  • 解決策: VBAで削除した後は、必ず 「データベースの最適化」 を手動で行うか、`DBEngine.CompactDatabase` を実行してください。これで物理的なファイルサイズも縮小されます。

2. 「どのインデックスが必要かわからない」

まずは「検索によく使う項目か?」を自分に問いかけてください。

  • 基準: ユーザーが「検索画面で絞り込み条件として使っている項目」以外は、一旦削除しても問題ないケースがほとんどです。

—

次のステップ:VBAで自動削除する時の注意

もし、不要と判断したインデックスをVBAでプログラム的に削除したい場合は、以下のメソッドを使います。

‘ 注意: インデックス削除は取り消し不可能です。必ずバックアップを取ってから!
tdf.Indexes.Delete “インデックス名”

先輩エンジニアからのアドバイス:
自動化のコードを書く際、いきなり `Delete` を実行するのは危険すぎます。まずは上記の「診断リスト」をイミディエイトウィンドウに出力させ、自分の目で確認してから削除する。この「慎重なステップ」を踏むことが、伝説のエンジニアへの第一歩です。

—

まとめ:Accessを「育てる」喜び

Accessは、ただ作って終わりではありません。使われていないインデックスを削ぎ落とし、筋肉質なデータベースへと育てていく作業は、まるで盆栽を剪定するような職人の営みです。

「ここをクリアすれば、Access VBAの基本はバッチリ」です。まずはご自身の環境でこの診断コードを動かし、無駄なインデックスがどれだけ眠っているか、その目で確かめてみてください。

あなたのAccessが、驚くほど軽快に動き出すはずですよ。応援しています!

タイトルとURLをコピーしました