| ||||||||||||||||||
| 前のページ 1 2 3 | ||||||||||||||||||
| 関数を使うほうがよい場合もある | ||||||||||||||||||
作成したビューを使って同様の検索を行います(図15)。ご覧のように、100倍以上遅い結果になってしまいました。 | ||||||||||||||||||
test=# EXPLAIN ANALYZE SELECT * FROM acview WHERE aid | ||||||||||||||||||
図15:ビューを使用した場合 | ||||||||||||||||||
| これはaccountsテーブルを順スキャンしているからです。さらに、このビューの結果は最初のビューを使わない問い合わせの結果と必ずしも一致しません。このような場合は、SQL関数を使う方が適切です。 まず、検索結果に対応する型を定義します。 | ||||||||||||||||||
CREATE TYPE acftype AS (bid INTEGER, aid INTEGER); | ||||||||||||||||||
次に、関数を定義します。 | ||||||||||||||||||
CREATE FUNCTION acfunc(INTEGER) RETURNS SETOF acftype AS 'SELECT DISTINCT ON (bid) bid, aid FROM accounts WHERE aid | ||||||||||||||||||
この関数を使って検索する例を図16に示します。ご覧のように、ビューを使わない場合と同程度の速度が得られました。 | ||||||||||||||||||
test=# EXPLAIN ANALYZE SELECT * FROM acfunc(1000); | ||||||||||||||||||
図16:SQL関数を使った場合 | ||||||||||||||||||
| 前のページ 1 2 3 | ||||||||||||||||||
| ||||||||||||||||||
| ||||||||||||||||||
| ||||||||||||||||||

