2017-04-18 3 views
0

私はテーブルを持っており、そのカラムの最後のセルを取得する必要があります。テーブルは大ですが、私はできるだけ早くそれをやりたいのです。 最新の行(最大のタイムスタンプ)がテーブルの最後に追加されるというのが難点です。だから、実際には最後の行を得る最速の方法を理解する必要があります。私はこの試みたテーブルを変更せずにpostgreSQLデータベーステーブルの最後の行を取得する最速の方法

を: SELECT my_column FROM my_schema.my_table ORDER by timestamp DESC NULLS LAST LIMIT 1 をしかし、それは、本当に遅かった:私は、インデックスまたは恒久的にテーブルを変更したり、テーブルを作成する(私はビューを作成するに開いているEDIT)をせずにこれを実行したいのですが大きなテーブル

ので、私はこれを試してみました:

SELECT my_column FROM my_schema.my_table WHERE timestamp=(select max(timestamp) from my_schema.my_table)

と言っても遅く感じました。

どのような考えですか?

+2

あなたは私の一般的な文化のために、その列 –

+0

のインデックスを必要とする、それが最新に部分インデックスいるだろう「ポイント」を設定することが可能です行?そのような索引はほとんどスペースを使用せず、更新はコストがかかりません。 PostgreSQL(または他のRDBMS)もそのような機能を処理しますか? –

+0

その列のインデックスを作成する – Rams

答えて

0

ちょっとしたやり方で、最後に挿入した行を別のテーブルに保存することができます。

INSERT INTO ... RETURNING *; 

今、あなたはそれを使用し、別のテーブルに新しい行を保存することができます::INSERTクエリが値を返すことができ

お知らせ、

INSERT INTO my_schema.my_table_last_row(INSERT INTO ... RETURNING *); 

テーブルmy_table_last_rowが同じ列を持っている必要があります(または元のテーブルからちょうどINHERIT)。

トリガーON INSERTを使用してジョブを実行できます。

CREATE OR REPLACE FUNCTION remember_last_row() 
    RETURNS trigger AS 
$BODY$ 
BEGIN 
    TRUNCATE my_schema.my_table_last_row; 
    INSERT INTO my_schema.my_table_last_row VALUES(NEW.*); 

    RETURN NEW; 
END; 
$BODY$ 

CREATE TRIGGER remember_last_row_trigger 
    BEFORE INSERT 
    ON my_schema.my_table 
    FOR EACH ROW 
    EXECUTE PROCEDURE remember_last_row(); 

これは、元のテーブルに変更を加えずに(インデックスの追加を含めて)最後の行を挿入する最も速い方法だと思います。

もちろん、その行を更新すると複雑になります。コピーを更新したままにする必要があります。

ソリューション

シンプル - 店舗ちょうど最後timestap;)

+0

このアダムにとても多くの考えをお寄せいただきありがとうございます。残念ながら、私はこのデータベース全体に対して行った変更を最小限にしようとしています。分析イベントを追跡するためにAPIによって生成されたもので、テーブルを読み込むだけで目標を達成しようとしています。 – Acoustic77

関連する問題