2006/04/28

古いPostgreSQL でIN 句を利用したサブクエリーが重い現象について。

古いPostgreSQL でインデックスを正しく張っているにもかかわらず重かったらこれを疑ったほうが良いでしょう。

古いPostgreSQL のFAQ より。(無くなってしまったら困るので自分用にメモ。)
=======================================================================
4.22) なぜ、INを使う副問い合わせがとても遅いのですか?

7.4 より前のバージョンでは、副問い合わせは、副問い合わせの結果を外部問い合わせの各ロウについて順次走査することによって、外部の問い合わせに結合させられる
。副問い合わせがわずかなロウしか返さず、外部問い合わせが沢山のロウを返す場合は、INが最も早いです。他の問い合わせを高速化するには、INをEXISTSに置換します:

SELECT *
FROM tab
WHERE col IN (SELECT subcol FROM subtab)

を、置き換えて:

SELECT *
FROM tab
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col)

とします。これが手っ取り早いですが、subcolは索引付きカラムであるべきです。
=======================================================================

こんなふるいシステムは本来は使いたくないのですが・・。

0 件のコメント: