2011-07-10 9 views
-1

私はDjangoプロジェクトでPostgresを使っていますが、ストアドファンクションを使う必要はありません。次の問題に対して最も効率的なソリューションを見つけることは非常に重要です。Postgresで行を更新するストアドファンクションを作成するには?

私は次の列を含むテーブルを持っています: number | last_update | growth_per_second

そしてlast_updateとgrowth factorに基づいて数値を更新し、last_updateの値を現在の時間に設定するための効率的なソリューションが必要です。私はおそらく100、おそらく150kの行を持っています。可能であれば、すべての行を同じ時間に更新する必要がありますが、時間がかかりすぎる場合は、小さな部分で分割することができます。

+1

すべての行を「同時に」更新する必要がある場合は、ストアドプロシージャ/関数ではなくトランザクションを調べてください。 – Patrick

答えて

1

をすぐに計算することはできません。

この情報を維持する必要がありますか?もしそうなら、クエリが遅い場合はキャッシュできますか?あなたは、この情報をデータベース内で一貫性を保つことによって大規模なテーブルスラッシュのために自分自身を設定しています。

1

まず、このルートに行きたい場合は、サーバープログラミングに関する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)); 

これは検索目的で事前に計算されます。この方法で、次の操作を行いたい場合:

事前定義された値でインデックススキャンを使用できます。

もちろん、同じ手法を使用して事前計算して保存することはできますが、このアプローチは柔軟性があり、大きな結果セットを使用する必要がある場合は、一度自己結合して、機能。

関連する問題