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

Hashimoto, Masaru hashimoto-m @ comtecc.net
2002年 6月 18日 (火) 14:54:23 JST


橋本です。

> ソフト工房の近藤です。
> 
返信ありがとうございます。

> 
> > 件数が少ないと割合早く終わります。
> > ですが、更新されていない件数はあまり多くないので、
> > 毎回結構な量を更新する必要があります。
> > 
> > それでも、少しでも件数を少なくするために
> > 差分データにするようにお願いしたのですが、
> > データを吐き出すシステムのほうが対応していないので
> > 実現できませんでした。
> 
> 差分データーでないということは、更新の必要がない
> データーも含まれているということでしょうか。
> 
はい、含まれております。

> プログラムで、DB を読んで、外部データーと比較して、
> 相違のあるものだけ、UPDATE するようにしては如何でしょう。
> 殆んどのデーターが変更必要ならば、かえって遅くなる
> のでまずいですが、変更不要のデーターがある程度ある
> なら試してみる価値はあると思います。
> 
> ついでに、一時表に入れるのもやめて、外部データー
> (多分テキストファイル)から、プログラムで直接 INSERT/UPDATE
> したらどうなるでしょうか。諸処の条件によるので、早くなるか
> 遅くなるかわかりませんが。
> 
今回のWORKテーブルに入れて更新するという処理の前には、
近藤様のおっしゃってる通りの方法を考えておりました。
ただし、あまりにも時間がかかってしまったために
その処理はやめて、WORKテーブルに入れる方法に変更しました。
どうも70万回のSELECT文だけでもかなりの時間がかかっていたようです。
(そのときは全部で数時間単位の実行速度でした)

それで、いろいろ調査をしてみた結果、
UPDATEの場合もINSERTの場合もINDEXが使用されていないようです。
user_idの方はTB作成時にidをPRIMARY KEYにしていしてます。
また、work_user_tbの方はidでINDEXを作成しています。

これをIndex Scanにすることができれば、
少しは早くなるような気がするのですが・・・
ちなみに、それぞれをSQL文をSELECTに置き換えても同じ結果でした。

=UPDATEの場合のEXPLAIN=
Nested Loop  (cost=0.00..472022230.82 rows=2634084249 width=1784)
  ->  Seq Scan on user_tb  (cost=0.00..359796.33 rows=3629 width=957)
  ->  Seq Scan on work_user_tb  (cost=0.00..122708.21 rows=725821 width=827)

=INSERTの場合のEXPLAIN=
Merge Join  (cost=831927.47..844629.34 rows=725821 width=198)
  ->  Sort  (cost=327584.18..327584.18 rows=725821 width=132)
        ->  Seq Scan on work_user_tb  (cost=0.00..122708.21 rows=725821 width=132)
  ->  Sort  (cost=504343.29..504343.29 rows=725822 width=66)
        ->  Seq Scan on user_tb  (cost=0.00..356167.22 rows=725822 width=66)






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