Microsoft Access 掲示板

PostgreSQL、ODBCリンクテーブルに対する更新クエリのパフォーマンス

3 コメント
views

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;

はづき
作成: 2025/06/04 (水) 13:15:45
最終更新: 2025/06/04 (水) 14:26:24
通報 ...
1
はづき 2025/06/04 (水) 14:41:00 69f3e@da8eb

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;

これで何が違うかですが。。。

2

最初の更新クエリは、Local_tblの全レコード数分の更新処理が実行されます。
既にLink_tblに存在しているレコードは本来は更新の必要がないのに上書き更新されます。

あとの追加クエリはLink_tblに存在しないレコードのみ、Local_tblから追加されます。

更新クエリでも同様の条件を追加すれば新規レコードのみの更新(追加)になります。

UPDATE
 Local_tbl LEFT JOIN Link_tbl
 ON (Local_tbl.Global_ID = Link_tbl.Global_ID)
    AND (Local_tbl.Local_ID = Link_tbl.Local_ID)
SET
 Link_tbl.Global_ID = Local_tbl.Global_ID,
 Link_tbl.Local_ID = Local_tbl.Local_ID
WHERE Link_tbl.Global_ID Is Null AND Link_tbl.Local_ID Is Null;
3
はづき 2025/06/06 (金) 07:44:47 69f3e@da8eb

hatana様
どうもありがとうございます。
全件更新していたら重いですね。
最初の更新クエリのWhere条件を設定すればパフォーマンス改善しますね。

ちなみに、、、PostgreSQLに100万レコードくらい入っていまして、
ここに毎月、フィールド30、2万件レコードくらいを追加する想定なのですが、
単純なInsert文なのですが、10分弱くらいかかります。

ローカルでやると秒で終わる処理なのですが、ODBCリンクテーブルだと、
ここまでパフォーマンス悪いものでしょうか。