Accessのパススルークエリについてお探しですね。

広告

Accessのパススルークエリで業務システムを高速化しよう

Microsoft Accessで業務システムを作るとき、データの保存先としてSQL ServerやOracleといった本格的なデータベースを使うケースってよくありますよね。

普通はAccessの「リンクテーブル」という機能でデータを見たり更新したりするんですが、データが増えてくると「クエリがめちゃくちゃ遅い…」「画面が固まったみたいになる…」なんて悩みを抱えている人、実は結構多いんです。

そこで今回は、そんな速度の問題を一気に解決できるかもしれない「パススルークエリ」について詳しく解説します。

SQL Serverなどに直接命令を送って処理をスピードアップさせる仕組みから、実際に使うときのポイントまで、わかりやすくまとめてみました。

システムを快適にしたい方は、ぜひ参考にしてください。

1. パススルークエリって何?まずは基本から理解しよう

Accessの「パススルークエリ」というのは、ODBC接続を使って外部のデータベースサーバーに直接SQL命令を送る特別なクエリのことです。

普通のAccessクエリは、Access内部のエンジン(JETとかACEって呼ばれるもの)を通してデータを処理するんですが、パススルークエリはそのエンジンを「素通り」して、SQL Serverなどに直接命令を届けます。

だから「パススルー(通り抜け)」という名前なんですね。

この機能の一番のポイントは、Access独自の関数や処理方法に縛られずに、接続先のデータベースが持っている本来のSQL文法をそのまま使えることです。

例えばSQL Serverなら、T-SQL(Transact-SQL)という専用の関数や書き方をフルに活用できます。

これによって、複雑な集計処理や細かい条件指定を、サーバー側に全部任せられるんです。

しかもパススルークエリは、データを取り出すだけじゃありません。

権限さえあれば、データの一括更新(UPDATE文やINSERT文)、テーブル構造の変更(DDL)、さらにはサーバーに保存されているストアドプロシージャの実行まで、いろんなデータベース操作ができちゃいます。

Accessの画面から強力なデータベース機能を直接コントロールできるので、本格的な業務システムを作るときには欠かせない技術なんです。

2. なぜパススルークエリだと速くなるの?

パススルークエリを使う最大のメリットは、なんといっても処理スピードが劇的に速くなることです。

普通のリンクテーブルを使ったAccessクエリだと、データベースとのやり取りで無駄な通信がたくさん発生しちゃうんですよね。

どういうことかというと、Accessのクエリで複雑な条件や独自の関数を使うと、SQL Serverなどはその条件を完全には理解できません。

だから「とりあえず関連しそうな大量のデータを全部Accessに送っちゃえ!」ってなるんです。

で、そのあとAccess側が自分のパソコンのメモリとCPUを使って、必要なデータだけに絞り込んだり計算したりします。

これだとネットワークもパソコンも負担が大きくて、すごく遅くなっちゃうんです。

一方、パススルークエリを使うと、この無駄がほぼゼロになります。

書いたSQL文がそのままサーバーに渡されるので、データの検索、結合、集計といった重たい処理は全部、パワフルなSQL Server側で完結します。

そして最後に、必要最小限の結果だけがネットワークを通ってAccessに返ってくる仕組みです。

つまりパススルークエリは、「重い処理はサーバーにやってもらう」というクライアント・サーバーシステムの基本ルールに忠実なんですね。

数百万件もある巨大なテーブル同士の結合とか、複雑な集計とか、Access単体だとタイムアウトしちゃうような処理でも、サーバーの力を最大限に使えば数秒〜数十分の一の速さで終わらせることができます。

「最近データベースが遅いな…」と感じたら、処理の仕組み自体を見直す意味でも、パススルークエリの導入を検討してみる価値は大いにありますよ。

3. 普通のリンクテーブルとの違い、どう使い分ける?

Accessを使うとき、普通のリンクテーブルを使ったクエリとパススルークエリには、はっきりした違いがあります。

状況に応じて上手に使い分けることが大切です。

リンクテーブルを使ったクエリの良いところは、なんといっても手軽さです。

SQLの専門知識がなくても、Accessのクエリデザイン画面でマウス操作だけでテーブルをつなげたり、条件を設定したりできます。

小規模なマスターデータを見るとか、数千件くらいのデータを取り出すくらいなら、リンクテーブルでも十分実用的なスピードで動きます。

ただ、データ量がものすごく多くなったり、巨大なテーブルを何個も結合したりする場面では、リンクテーブルの仕組みが足を引っ張ります。

違うデータベース同士をつなげるような、Accessの柔軟性が活きる場面もあるんですが、同じSQL Server内で重い集計をリンクテーブル経由でやるのは効率が悪いんです。

そこで登場するのがパススルークエリなんですが、こちらはAccessのグラフィカルなデザイン画面が使えません。

SQL文を文字として直接書かなきゃいけないので、ちょっと技術的なハードルがあります。

なので実際の使い分けとしては、システムの設定値を取得するとか、簡単なコード変換とか、処理が軽くてメンテナンスのしやすさを重視する部分にはリンクテーブルを使うのがおすすめです。

逆に、毎日の売上集計とか、大量の履歴データから特定の条件に合うレコードを探すとか、データの一括更新とか、スピードが最優先される重要な処理にだけパススルークエリを使う、というのが賢いやり方です。

両方をうまく組み合わせることが、快適なAccessアプリを作るコツなんですね。

4. パススルークエリを使うときの注意点と動的実行のコツ

すごく強力なパススルークエリですが、実際のシステム開発で使うときにはいくつか注意点があります。

一番大きな制約は、クエリ内のSQL文が固定の文字列として扱われるため、普通のAccessクエリみたいに「フォームのテキストボックスの値を条件として使う」ことが標準機能だけでは難しいという点です。

業務システムでは、ユーザーが画面で選んだ日付範囲のデータだけを取り出したい、なんて要件がよくあるんですが、パススルークエリ単体ではこれができないんです。

この問題を解決するには、Access VBA(Visual Basic for Applications)と組み合わせて、クエリを動的に書き換える技術が必要になります。

具体的には、VBAのDAO(Data Access Objects)というライブラリを使って、こんな手順で実行します。

・フォームから条件となる値(日付やIDなど)を取得する
・処理を実行する直前に、既存のパススルークエリのオブジェクト(QueryDef)を呼び出す
・VBAの文字列結合機能を使って、取得した値をWHERE句に埋め込んだ新しいSQL文を作る
・QueryDefオブジェクトのSQLプロパティを新しいSQL文で上書きしてから、クエリを開く

もう一つの注意点として、パススルークエリ内ではAccess独自の関数(Nz関数とかFormat関数とか)が一切使えないことも覚えておきましょう。

SQL Serverに接続しているなら、ISNULL関数やCONVERT関数など、そのデータベース専用の関数に置き換えて書く必要があります。

こういった制約や実装の手間は確かにありますが、それを補って余りあるほどのスピードアップが得られるのがパススルークエリの魅力です。

要件に合わせてVBAを活用して、サーバーの処理能力をフルに引き出す設計を取り入れてみてください。

きっとシステムが見違えるほど快適になりますよ。

広告