[pgsql-jp: 36833] Re: 別テーブルを条件にしたUPDATEの性能(Re: WHEREにSELECTふたつ)

TANIDA Yutaka tanida @ sraoss.co.jp
2006年 3月 7日 (火) 13:35:20 JST


谷田です。

On Tue, 07 Mar 2006 13:11:31 +0900
河本陽一 <komoto.yoichi @ kcc.co.jp> wrote:

> こうもとです。

お久しぶりです:)

> 案1(PostgreSQL専用):根岸さんと、海北さんの方法
> UPDATE t1 SET f3=f3+1
>     FROM t2 WHERE t1.f1=t2.f1 AND t1.f2=t2.f2 AND t2.f5='a01';
> 
> 案2(汎用):石田さんの方法
> UPDATE t1 SET f3=f3+1
>     WHERE (f1,f2)=(SELECT f1,f2 FROM t2 WHERE f5='a01');
> 
>  結果は、圧倒的に案1の方早いことがわかりました。

explain analyzeの結果はどうなっていますか?あとanalyzeはしてますか?

たぶん案1は何かJOIN、案2は普通にループになっているのではと思います。で
あれば、案1が圧倒的に早いのは理の当然ではないかな、と思います。

案2のようなものも、SELECTであれば7.4以降で案1のように展開されるように
なっています。これは

http://www.sraoss.co.jp/PostgreSQL/7.4/changes.html

の

IN/NOT INを使った副問い合わせをより効率的に実行できるようになりました。
 7.3以前のバージョンではこれらの副問い合わせはより上位の問い合わせとシー
ケンシャルスキャンを利用して結合するようにしていました。7.4ではたとえば
副問い合わせを通常のJOINに変換するような方法で、これらの検索は非常に高速
化されました。

にあたるもので、案2->案1はそれのupdate版書き換えに相当するものです。

-- 
TANIDA Yutaka <tanida at sraoss.co.jp>





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