[pgsql-jp: 26377] Re: 大量データの更新

ISHIDA Akio iakio @ pjam.jpweb.net
2002年 6月 14日 (金) 20:02:22 JST


石田@苫小牧市です。

On Fri, Jun 14, 2002 at 06:55:14PM +0900, Hashimoto, Masaru wrote:
> 橋本です。
> 
> >  トランザクション中にテーブル全体を排他ロックしてしまい、その間に DELETE
> > と INSERT を行ってしまってはどうでしょう。
> > 
> なるほど、そういう方法もあるのですね。
> 
> >  しかし、70万件ともなると平気でWALのチェックポイントを超えてしまうと思い
> > ますが、この更新処理の間で障害が起こった場合の対策はどうしていますか?
> > 
> 実は現在のプログラム上では特に対策を行ってません。
> ・・・とても危険ですね。
> このあたりも書籍等をしらべて対策を練ろうと思います。
> 
> あと、追加質問で申し訳ありませんが、
> 大量データの更新を行った後が、なんとなく
> DBへの接続が遅くなっているような気がします。
> 気のせいだとは思いますが・・・
> 
> VACUUMとREINDEXは実行してます。
> それ以外に考慮したようが良い点はありますか?
> 
> 質問ばかりして申し訳ありません。
> いたらない点がありましたらご指摘ください。

ここに対する回答ではありませんが (かつ、はずしてるかもしれませんが)、

user_tb 側に index があるのであれば、insert をおこなうまえに
drop index し、insert が終ってから create index しなおした方が
速くなるかもしれません。

work_user_db 側には index があったほうがよさそうです。

あと、増えた分の INSERT は、

INSERT INTO user_tb ( id, name )
SELECT work_user_tb.id, work_user_tb.name
FROM work_user_tb
 WHERE NOT EXISTS 
 (SELECT * FROM uesr_tb
   WHERE user_tb.id = work_usre_tb.id)

とも書きかえられそうなので、試してみる価値はありそうです。

-- 
ISHIDA Akio




pgsql-jp メーリングリストの案内