まず、このルートに行きたい場合は、サーバープログラミングに関するPostgreSQLのドキュメントから始めて、試したことに基づいて質問に戻ってください。とにかくこの分野に精通しているのは、あなたが何をしているかによって異なるからです。
あなたのデータはすべて挿入され、更新されていないと仮定すると、ではありません。はこの情報をデータベースに直接格納します。それが情報の量が少ない場合は、とにかくインデックススキャンを終了し、小さな結果セットを返す場合は、これを迅速に計算できるはずです。
代わりに私はこれを行うでしょう:last_updateカラムを同じテーブルの外部キーにしてください。テーブルが次のようになっているとします。
CREATE TABLE hits (
id bigserial primary key,
number_hits bigint not null,
last_update_id bigint references hits(id),
....
);
次に、次の関数を作成します。下記の注意点に注意してください。
CREATE FUNCTION last_update(hits) RETURNS hits IMMUTABLE LANGUAGE SQL AS $$
SELECT * FROM hits WHERE id = $1.last_update_id;
$$;
この機能を使用すると、小さな結果セットで最後の更新レコードに移動できます。ヒットテーブルに更新や削除がないことを保証している場合にのみ、不変の指定は安全です。これを行うと、それをstableに変更する必要があり、出力のインデックス作成機能が失われます。あなたは、この保証を行ってから更新を行う必要がある場合は、我々はできる、そこから
....あなたはMUSTこれは(表がヒットインデックスを再作成)を使用するすべてのインデックスを再構築し、これはしばらく時間がかかることがあります。
CREATE FUNCTION growth(hits) RETURNS numeric immutable language sql as $$
SELECT CASE WHEN ($1.last_update).number_hits = 0 THEN NULL
ELSE $1.number_hits/($1.last_update).number_hits
END;
$$;
その後、我々は次のことができます。
SELECT h.growth -- or alternatively growth(h)
FROM hits
WHERE id = 12345;
そして、それはそれを自動的に計算します。成長を検索したい場合は、次のように出力をインデックスすることができます。
CREATE INDEX hits_growth_idx ON hits (growth(hits));
これは検索目的で事前に計算されます。この方法で、次の操作を行いたい場合:
事前定義された値でインデックススキャンを使用できます。
もちろん、同じ手法を使用して事前計算して保存することはできますが、このアプローチは柔軟性があり、大きな結果セットを使用する必要がある場合は、一度自己結合して、機能。
すべての行を「同時に」更新する必要がある場合は、ストアドプロシージャ/関数ではなくトランザクションを調べてください。 – Patrick