PostgreSQLのテーブルをローカルのAccess上にODBCリンクテーブルで表示しています。
フィールドは、Global_ID(数値型)、Local_ID(数値型)の2つ、レコードは2万件程度です。
これに対し、
Access内のテーブル
Link_tbl:PostgreSQLのリンクテーブル
Local_tbl:PostgreSQLのリンクテーブルと同じ構造のローカルテーブル
Link_tbl/Local_tbl
Local_ID:主キー
Global_ID:主キー
ローカルからPostgreSQLにGlobal_ID、Local_tblの新規の組み合わせを追加(無いものを追加)するための
更新クエリを下記のように作成しました。ローカル上で実行すると一瞬で終わる処理が、
想像以上の時間がかかりまして、何が問題なのか教えていただけますと幸いです。
UPDATE Local_tbl LEFT JOIN Link_tbl ON (Local_tbl.Local_ID = Link_tbl.Local_ID) AND (Local_tbl.Global_ID = Link_tbl.Global_ID)
SET Link_tbl.Global_ID = Local_tbl.Global_ID, Link_tbl.Local_ID = Local_tbl.Local_ID;
Local_tblにあってLink_tblに無いものを抽出(これをクエリ1として保存)
SELECT Local_tbl.Global_ID, Local_tbl.Local_ID
FROM Local_tbl LEFT JOIN Link_tbl ON (Local_tbl.Global_ID = Link_tbl.Global_ID) AND (Local_tbl.Local_ID = Link_tbl.Local_ID)
WHERE Link_tbl.Global_ID Is Null AND Link_tbl.Local_ID Is Null;
クエリ1を基に、Link_tblに追加
INSERT INTO Link_tbl ( Global_ID, Local_ID ) SELECT クエリ1.Global_ID, クエリ1.Local_ID FROM クエリ1;
これで何が違うかですが。。。
最初の更新クエリは、Local_tblの全レコード数分の更新処理が実行されます。
既にLink_tblに存在しているレコードは本来は更新の必要がないのに上書き更新されます。
あとの追加クエリはLink_tblに存在しないレコードのみ、Local_tblから追加されます。
更新クエリでも同様の条件を追加すれば新規レコードのみの更新(追加)になります。
hatana様
どうもありがとうございます。
全件更新していたら重いですね。
最初の更新クエリのWhere条件を設定すればパフォーマンス改善しますね。
ちなみに、、、PostgreSQLに100万レコードくらい入っていまして、
ここに毎月、フィールド30、2万件レコードくらいを追加する想定なのですが、
単純なInsert文なのですが、10分弱くらいかかります。
ローカルでやると秒で終わる処理なのですが、ODBCリンクテーブルだと、
ここまでパフォーマンス悪いものでしょうか。