Microsoft Access 掲示板

パススルー?クエリについて

4 コメント
views
4 フォロー

お世話になります。
ACCESSからODBC接続にてSQL server に接続しています。

SELECT T_受注.ID,T_仕様.品名 FROM T_受注 LEFT JOIN T_仕様 WHERE T_受注.会社='001'

このようなクエリで 表示されるのが 20秒くらいかかるくらいのデータ量があります。
しかし、このSQLを下記のように書き換えると1秒くらいで表示されます。

SELECT A.ID,B.品名 FROM
[ODBC接続文字列].T_受注 A LEFT JOIN [ODBC接続文字列].T_仕様 B ON A.ID = B.ID
WHERE A.会社='001'

「ODBC接続文字列」はパススルークエリで使用しているものです。
最初はこう書けば、選択クエリが自動的にパススルークエリになるのか!と思っていたのですが、このクエリの結果は更新可能です。
パススルークエリの結果は更新できないもの、とされているのでパススルーではないのかもしれません。

前置きが長くなりましたが、さらにテーブルを一つ繋げて

SELECT A.ID,B.品名,C.単価 FROM
([ODBC接続文字列].T_受注 A LEFT JOIN [ODBC接続文字列].T_仕様 B ON A.ID = B.ID)
LEFT JOIN [ODBC接続文字列].T_価格 C ON A.ID = C.ID
WHERE A.会社='001'

とすると また20秒くらいの時間がかかるようになります。

なんとかして時間を短縮したいのです。
なにか情報をお持ちの方がいたら、よろしくお願い致します。

AI2000
作成: 2021/06/17 (木) 12:15:11
最終更新: 2021/06/17 (木) 15:07:39
通報 ...
1
朱色 2021/06/17 (木) 19:57:54 db0eb@bbb08

自分の環境(明細15000万くらいから26万抽出)の場合、単純抽出であれば即時表示されますね。
抽出したデータを集計させるとか、最後の行を表示しろとかすると時間が掛かりますが・・・。
インデックスの問題とかでしょうか。
もしフォームやレポートに表示するのであれば、そちらの情報提示していただけると
他の情報を誰かが出してくれるかもしれません。

単純に「パススルークエリにすれば解決するんや!」であれば、ちゃんとした形のパススルークエリを作成するか、
動的にしたいのであればVBAでQueryDef.sqlを書き換えるという手があります。
データベース・サーバに直接コマンドを発行する ←パススルークエリの作り方
VBAでクエリを作成する (DAO) ←動的にSQLを設定したい場合

ちなみにパススルークエリで書き込むSQLは、SQLServer形式にする必要があります。
具体的にいうと”FROM ( A LEFT JOIN B ON ...) LEFT JOIN C ON ...”ではなく
”FROM A LEFT JOIN B ON ... LEFT JOIN C ON ...”で動作します。

2
AI2000 2021/06/18 (金) 09:24:29 8c4bd@8699c

回答ありがとうございます!
実は未だにAccessのADPを使って運用しています。
いよいよ使えなくなりそうだということで、.accdb のODBC接続を勉強しているところです。
数年ぶりにACCESSをいじっています。

>明細15000万くらいから26万抽出

すごいデータ量ですね! そんなに多いのに即時!?
データはせいぜい50万件ぐらいです。しかしサーバーも10年以上前のものなので比較にならないかもしれません。

>インデックスの問題とかでしょうか。

インデックス! その発想はありませんでした。最初に設定しただけで全然いじってないので可能性はあるかもしれません。
インデックスの設定によっては、発行されるSQLの違いで速度に影響がでるという認識でよいでしょうか?

>もしフォームやレポートに表示するのであれば、

いずれはそうしたいのですが、まだその段階ではありません。
ODBC接続の遅さにびっくりしてしまって、いろいろとSQLをいじっているところです。

パススルークエリは速いのですが、編集可能にしたいのです。
インデックスについて勉強したいと思います。

3
AI2000 2021/06/18 (金) 17:24:48 8c4bd@8699c

いろいろといじっているうちに遅くなっている原因がソート(ORDER BY)であることがわかりました。
サンプルには記載せず申し訳ありません。
ORDER BY の部分を消すと即時表示されるようになりました。

ソートしてる列に クラスター/非クラスターインデックスの設定をいろいろとしてみましたが、相変らず遅いです。
その項目の型は float型なのですが、何か関係はあるのでしょうか?

いずれにしても2つのテーブル結合のクエリでは速く、3つのテーブル結合では遅くなるという原因がわかりません。
引き続き調べてみます。

4
朱色 2021/06/21 (月) 19:59:40 修正 db0eb@2db89

データを直接修正することについての是非は横においておくとして・・・

3結合にすることでデータ量が増えるということはないですか?
たとえば2結合では 1-A、2-B だったのに、3結合では 1-A-a、1-A-b、1-B-c という風に。
それぞれの結合が、各サブテーブルのすべてのキー項目と連結されているなら増えないハズ。

あと邪道ですが、SQLServer側にVIEWを作ってそれに対してリンクを張るという手もありますね。
お勧めはしませんが。

すみません、パフォーマンス系の知識はあまりなくて。
他の方の有用回答にご期待ください(;==)/

(ちなみにテーブル構造と結合部分が完全なSQL貼ってくださったほうが良いと思います)