質問: ### 前提・実現したいこと マイクロソフトアクセスを使用しています。 アクセスのデータはバックエンドにマイクロソフトのアクセステーブル(容量が65,500KB)を設定し フロントエンドにはマイクロソフトのアクセスにバックエンドのテーブルをリンクテーブで接続し クエリ・フォームで運用していますが指定クエリでのフォーム表示時間がかかります。 この使用環境で表示時間を早くするためリンクテーブルをやめて、 パススルークエリを使用して早くしたいのですが可能でしょうか? バックエンドのマイクロソフトのアクセステーブルを他のデータベース(MySQL,オラクル?)に する必要があるのでしょうか? ### 試したこと 管理ツールのODBC Data Sources (32-bit)をユーザーDSN/システムDSNを設定し、 パススルークエリのODBC接続文字列設定を[ODBC;DSN=●●● ] でバックエンドのテーブルに呼込み 実行をトライしましたが、 [ ODBCを使用して、外部の Microsoft Access データベースエンジンのテーブルや組み込み可能 なISAM データベースのテーブルのインポート、エクスポート、またはリンクを行うことはできま せん。] になります。 ### 補足情報(FW/ツールのバージョンなど) Windows 10 Pro Microsoft Office Professional Plus の Microsoft Access accdb
回答: リンク先がアクセステーブルならパススルークエリは使えません。 バックエンドがSQLサーバー、オラクルなどのRDBMSである必要があります。 容量が65,500KB程度のデータ量なら、ネットワーク環境にもよりますが、テーブルの設計、インデックスの設計、クエリの設計が最適化されていればそれほど重くなるとは思えません。まずはその辺りを見直すことから始めてはどうでしょうか。 SQLサーバー、オラクルなどのRDBMSへの移行はそれなりにコストがかかりますので、それからでも遅くないと思います。 補足 パススルークエリとは、サーバー側でSQL処理を実行してその結果のみを受け取るという仕組みです。 一般的にサーバーは高速なマシンを使うので、クライアントよりは高速に処理できる、 また、結果データのみ送信されるのでネットワークの負荷も軽くなり高速に処理できるわけです。 SQLサーバー、オラクルなどのリレーショナルデータベースマネージメントシステム(RDBMS)では、サーバーで常にマネージメントシステムが稼働していて、クライアントから受け取った命令を実行できるようになっています。 Accessはファイル共有型リレーショナルデータベースというもので、サーバー側のマネージメントシステムはなくOSのファイル管理システムを利用してデータを共有しています。サーバーからすべてのデータを受け取って、ローカルでSQL処理を行います。ですので、サーバー側に処理を依頼するパススルークエリは使えません。 「サーバーからすべてのデータを受け取って」と書きましたが、インデックスが設定してあると、インデックスを有効に使えるクエリ設計だと、まず、インデックスデータを受け取って、それを元にある程度必要なデータを絞り込んで受け取るという処理を実行しているようです。ですので、テーブル設計、インデックスの設定、クエリの設計は高速化に重要になります。 抽出条件でインデックスが無効になる場合 - hatena chips 結合条件でインデックスが無効になる場合 - hatena chips