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

Mashiki mashiki @ yanah.com
2002年 3月 28日 (木) 20:21:59 JST


 Mashikiです。

>> どうでしょ?
>ヒントを元に
> delete from history
>  where time < (
>  	select time from history order by
> 	time desc limit 1 offset 200000-1
> )
> ;
>を実行したところ、実行時間は10秒ほどで処理できました。
>当初の目標は10分以内でしたので達成することができました。有り難うございま
>した。
>しかし何でこんなに所要時間が変わってくるのでしょうか。

http://www.linux.or.jp/JF/JFdocs/PostgreSQL-FAQ.html

に

>>> 外部問い合わせの各行について副問い合わせの結果を順番に
>>> スキャンすることにより、副問い合わせを外部問い合わせに結合しています

とあります。わかりにくい日本語ですが書いてあるとおりだとすると、
削除前のhistory表の件数が400,000件だとすれば、in句の中のSQLの結果が
出た後、さらに削除対象レコード特定のため平均 200,000×400,000÷2回の
キーの比較が必要になります。

それが、今回の修正で400,000回の日付の比較ですむようになりました。
timeにインデクスが張ってあれば比較の回数はさらに減りますし、
in句の中のSQLの実行の際の比較にも使えるので、さらにスピードが上がると
思います。


件数の多いテーブルのwhere句の中で件数の多い結果を返すin句は使うな!
ってことで。


#でも
>  where time < (
>  	select time from history order by
> 	time desc limit 1 offset 200000-1
> )
#こんなテクニックが使えるのはPostgresだけですね。



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