PostgreSQL のクエリーパフォーマンスが where 条件内に副問合せ or 関数を直接指定で劇的に違う件


PostgreSQL 8.4 で where 条件の指定を副問合せにするか関数の値を直接指定するかでパフォーマンスが劇的に違ったという話。

PostgreSQL 8.4 でまず複雑なSQLを一つの関数にまとめる。

create or replace function getid_func(text)
RETURNS integer
AS $PROC$

select id from table where
(複雑な条件)
order by id desc
limit 1
;

$PROC$
LANGUAGE SQL
;

次に、この関数を使って、実際に値を取得する。

パターンA:副問合せ

select *
from table
where id = (select getid_func(textvalue))

パターンB:関数を条件に直接指定

select *
from table
where id = getid_func(textvalue)

explain で調べると、Bはいちいち値を調べるらしく(Filter…云々と出る)、パフォーマンス激落ち。びっくりした。