Ms-accessがリンクテーブルのODBC呼び出しを生成する方法を知っているかどうかを誰かが知っているかどうか、私は興味があります。
私が尋ねる理由は、システムのフロントエンドを非常に効率的にして、ODBC呼び出しの数を最小限に抑えようとしています。MySqlを使用しており、いくつかのテストを実行していますMySqlサーバーからの一般的なログを見ると、フロントエンドからの呼び出しの数に驚きました。
非常に単純な例
MySQLで次のテストデータを作成します。
CREATE TABLE table1 (table1_id int(11) NOT NULL,
column1 int(11) DEFAULT NULL,
column2 int(11) DEFAULT NULL,
column3 int(11) DEFAULT NULL,
PRIMARY KEY (table1_id)
) ENGINE=InnoDB;
INSERT INTO sales.table1 (table1_id) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11);
Ms-accessでtable1へのリンクテーブルを作成して開きます。これは、一般的なログファイルに表示されるものです。
2011-05-29 16:58:00, SELECT `table1`.`table1_id` FROM `table1`
2011-05-29 16:58:00, SELECT `table1_id`,`column1`,`column2`,`column3` FROM `table1` WHERE `table1_id` = 1
2011-05-29 16:58:00, SELECT `table1_id`,`column1`,`column2`,`column3` FROM `table1` WHERE `table1_id` = 1 OR `table1_id` = 2 OR `table1_id` = 3 OR `table1_id` = 4 OR `table1_id` = 5 OR `table1_id` = 6 OR `table1_id` = 7 OR `table1_id` = 8 OR `table1_id` = 9 OR `table1_id` = 10
2011-05-29 16:58:00, SELECT `table1_id`,`column1`,`column2`,`column3` FROM `table1` WHERE `table1_id` = 11 OR `table1_id` = 11 OR `table1_id` = 11 OR `table1_id` = 11 OR `table1_id` = 11 OR `table1_id` = 11 OR `table1_id` = 11 OR `table1_id` = 11 OR `table1_id` = 11 OR `table1_id` = 11
ストアドプロシージャで実行できる1回のヒットですべてのデータを取得するのではなく、4つの手順が必要なようです。
1)table1から主キーのリストを取得します
2)where句で明示的に選択して、最初の10レコードを要求します。
3)where句でレコードを明示的に選択して、次の10レコードを取得します。
4)最初のレコードはテーブルを開くことに重点を置いているため、最初のレコードを再度クエリします
基準table1_id=11
を10回繰り返します。
ODBCのクエリを完全に制御する唯一の方法は、それらを パススルークエリ として作成することです。
そのモードでは、Accessはそれらに触れず、SQLはそのままサーバーに渡されます(そのため、クエリはそのサーバーの特定のSQL構文で記述する必要があります。そうしないとエラーが発生します)。
ODBC=モードでは、Accessはコントロールにバインドされているクエリをバッチに分解するため、表示する必要があるより多くの結果を返すことはありません(つまり、プライマリに基づいてクエリを分解します)特定のレコードのみを返すキー)。
したがって、必要なことに注意する必要があります。パススルーを使用してクエリを最適化すると、呼び出しが少なくなりますが、すべてのデータが返されます。
一方、Accessにクエリを実行させると、チャットの質が向上しますが、返されるデータが少なくなるため、ネットパフォーマンスは向上する可能性があります。
両方をテストし、正確なクエリとその使用方法に応じて最適なものを選択する必要があります。