2011年10月16日日曜日

Access で使うパススルークエリ

Accessで開発しているシステムはDBにPostgreSQLのサーバーを使っているのですが、どうにもこうにも、レコードのコピーなどが遅く、閉口するくらいになってきた。
今まで何とか動いていたが、ここに来て、他の顧客にも導入しないといけなくなり、その顧客のネット環境がなんと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 件のコメント: