今まで何とか動いていたが、ここに来て、他の顧客にも導入しないといけなくなり、その顧客のネット環境がなんとADSL。しかも、めちゃ遅い環境。
これではまずいと思い、あわてて対策を検討。前々から、パススルークエリーというものがあるのは分かっていたが実験せず、リンクテーブルを使っていました。
リンクテーブルを使うと、よくわかりませんが一旦サーバーにあるレコードの情報をキャッシュするらしく、テーブルをオープンするだけで、何秒、いや数十秒待たされることがわかりました。
また、ADOを使って、単純なインサートを行うだけでも、ローカルのHDがガチャガチャ言い始めキャッシュされている模様。
これはAccessの仕組み上仕方ないことなのでやり方を変更。
パススルークエリは、Accessを介さずに直接DBにSQLを投げてやることができ、実験したら、本当のDBのレスポンスを獲得することができました。
そして、使い方も簡単。
Dim qd as Querydef
Set qd = CurrentDb.CreateQuerydef("")
qd.connect = "ここにodbcのconnct stringを書く"
qd.ReturnRecord = false '***結果を返さないクエリの場合 返す場合はTrue
qd.sql = " insert into tableA select * from tableB where key ='aaa'"
qd.execute
たったこれだけなんです。
構築しているシステムの関係上、Accessのローカルテーブルと、サーバーのテーブルを使って、やり取りをしている場合は、パススルークエリーは使えませんが、そうじゃない場合は、このパターンでPostgreSQLの素のレスポンスを味わうことができます。
ちなみに、結果を返すレコードセットの場合は、
Dim qd as Querydef
dim rs as DAO.recordset
Set qd = CurrentDb.CreateQuerydef("")
qd.connect = "ここにodbcのconnct stringを書く"
qd.ReturnRecord = false '***結果を返さないクエリの場合 返す場合はTrue
qd.sql = "select * from tableB where key ='aaa'"
set rs = qd.OpenRecordset()
これだけです。
もっと早くに気がつけばよかったのですが、これからこの部分を直すのは
コードを探し出す手間と、変更、変更後の検証に時間がかかるので、要所要所だけにすることにします。
0 件のコメント:
コメントを投稿