こんにちは、Accessブロガーのなかぜんです。
Accessでデータを扱っていると、「なんだかクエリの処理が遅いなぁ…」と感じることありませんか?
ちょっとした集計や検索でも時間がかかると、作業の効率がガクンと落ちてしまいますよね。
でも大丈夫!Accessのクエリが遅くなるにはちゃんと理由があるんです。本記事では、初心者でもすぐできるチェックポイントから、中級者向けのテクニックまで、やさしく丁寧に解説します。
クエリが遅いときの5つのチェックポイント
1. 不要なテーブルを結合していないか?
クエリに使っていないテーブルを結合していませんか?使わないテーブルまで結合すると、その分余計な処理が増えてしまいます。
対策:クエリデザインビューで、使用していないテーブルは削除しましょう。
2. 検索対象フィールドにインデックスが設定されているか?
インデックスは検索のスピードアップに重要です。検索条件に使っているフィールドにインデックスが無いと、毎回全件スキャンされてしまいます。
設定方法:テーブルのデザインビューで該当フィールドを選択し、「インデックス」を「あり(重複可)」にします。
3. ワイルドカードの位置に注意
以下のようなクエリは要注意です。
SELECT * FROM T_顧客 WHERE 氏名 LIKE '*山田*';
このように前後に「*」を使ってしまうと、インデックスが効かなくなります。
改善案:前方一致(例:LIKE ‘山田%’)に変更することで、高速化できます。
4. WHERE句で関数を使っていないか?
例えば、以下のような条件:
WHERE Year(納品日) = 2024
このように関数を使うとインデックスが無効化され、検索が遅くなります。
改善案:次のように範囲指定しましょう。
WHERE 納品日 BETWEEN #2024/01/01# AND #2024/12/31#
5. ソート(ORDER BY)を多用していないか?
並び替えもクエリを重くする原因です。必要なとき以外はORDER BYは使わないようにしましょう。
実例で確認!インデックス設定の画面とSQL改善
インデックスの設定画面

テーブルのデザインビューで、インデックスを「あり」にするだけで検索速度が大幅に改善することがあります。
改善前のSQL例
SELECT * FROM T_顧客
WHERE 氏名 LIKE '*山田*';
この書き方だと、インデックスが効かず全件検索になってしまいます。
改善後のSQL例
SELECT * FROM T_顧客
WHERE 氏名 LIKE '山田%';
前方一致にすることで、インデックスが使えるようになり、処理速度が向上します。
よくあるミスや注意点
- IIf関数のネストが多すぎて処理が重い
- クエリを直接フォームやレポートのコントロールソースに使っている
- 複数の結合・並び替えを一度に行っている
これらは処理時間が長くなる原因です。できるだけ処理を分けたり、中間クエリを使うようにしましょう。
応用編:中級者向けのクエリ高速化テクニック
クエリを分割して処理を分ける
一つのクエリで全部やろうとせず、2~3段階に分けて処理すると、処理速度も読みやすさも向上します。
一時テーブルの活用
複雑な集計や多量データを扱う際は、一時テーブルを使って中間結果を保存→次のクエリで参照すると高速化できます。
VBAでDAOを使ってクエリ実行
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "Q_更新処理", dbFailOnError
DoCmd.OpenQuery
よりDAOの方が速いケースもあります。
まとめ:原因を知ればクエリはもっと速くなる!
Accessクエリの遅さには必ず理由があります。今回紹介したようなポイントを見直すだけで、大幅な改善が見込めます。
- テーブルの見直し
- インデックスの設定
- SQLの記述の工夫
- 処理の分割
「あれ?遅いな」と思ったら、まずはこの5つのチェックを試してみてくださいね!
次のステップ
次回は「複数テーブルを使った効率的なJOINの書き方」について紹介予定です。お楽しみに!
ではまた、なかぜんでした😊
