|
||||||||||||||||||
| 前のページ 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 |
||||||||||||||||||
|
|
||||||||||||||||||
|
|
||||||||||||||||||
|
||||||||||||||||||
|
|
||||||||||||||||||
|
||||||||||||||||||
|
|
||||||||||||||||||
|
||||||||||||||||||

