[pgsql-jp: 25463] Re: deleteにすごく時間がかかる現象について

kiyoshi.yoshida kiyoshi.yoshida @ mail.toyota-shokki.co.jp
2002年 3月 28日 (木) 18:43:39 JST


Mashikiさん、つるつるさん、リプライ有り難うございます。
吉田です。

>  Mashikiです。
> 
> >create table history(mykey serial primary key, 
> >	time timestamp default current_timestamp, msg text);
> >上記のテーブルで、20万件ほどの行を削除しようとすると処理時間に2,3時間か
> >かってしまいます。
> >実現したいことは、このテーブルから20万件を超える行はtimeソート順に古い物
> >から削除したい、ということです。(表現がつたなくて申し訳ありません)
> >そのためのSQL文は、以下のように実施してみました。
> >SQL文:
> >delete from history where mykey in(select mykey from history order by
> >time desc offset 200000);
> >
> >処理時間をもっと速くする方法(SQL文を変更するとか)はないのでしょうか。
> 
> 
> 時間が古いほど、キーが小さいことが保証されるなら
> セレクト文で20000件目のキーを取得して
> キー指定でデリートすれば速い思います。
> 
> delete from history
>  where mykey < (
>  	select mykey from history order by
> 	time desc limit 1 offset 200000
> )
> ;
> 
> どうでしょ?
ヒントを元に
 delete from history
  where time < (
  	select time from history order by
 	time desc limit 1 offset 200000-1
 )
 ;
を実行したところ、実行時間は10秒ほどで処理できました。
当初の目標は10分以内でしたので達成することができました。有り難うございま
した。
しかし何でこんなに所要時間が変わってくるのでしょうか。

> こんにちは、つるつると申します。
> 
> ご存じかもしれませんが、下記のURLに「IN」を使った副問い合わせは
> 遅いので、「EXISTS」を使いましょうとの記述があります。
> 可能でしたら、一度お試しになられては如何でしょうか。
> 
> http://www.linux.or.jp/JF/JFdocs/PostgreSQL-FAQ.html
> >4.23) なぜ、INを使う副問い合わせがとても遅いのですか?
> 
> #試した結果どのくらい早くなったか解りましたら結果をアップして頂けると
>   助かります。
>   根本的に外している場合は、ごめんなさいです。
delete from history 
	where exists
		(select * from 
		(select * from history order by time desc offset 200000) l0
		where l0.mykey=history.mykey);
で試してみましたが、それほど効果はなかったようです。

吉田




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