2017-04-18 96 views
0

我有一個表,我需要獲取其中一列的最後一個單元格。桌子很大,我想盡快做到。 訣竅是最新的行(最大時​​間戳)被添加到表格的底部。所以我真的只需要找出最後一行的最快方法。我想這樣做沒有做索引或永久修改表或創建表(編輯:我願意做意見)在不修改表的情況下獲取postgreSQL數據庫表中最後一行的最快方法

我已經試過這樣: SELECT my_column FROM my_schema.my_table ORDER by timestamp DESC NULLS LAST LIMIT 1 ,但它是真的慢大表

所以我嘗試這樣的: 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查詢可以返回值:

INSERT INTO ... RETURNING *; 

現在你可以使用它,並在一個單獨的表保存新行:

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

相關問題