【问题标题】:Fastest way to get the last row in a postgreSQL database table without modifying table在不修改表的情况下获取 postgreSQL 数据库表中最后一行的最快方法
【发布时间】:2017-09-14 17:15:22
【问题描述】:

我有一个表格,我需要获取其中一列的最后一个单元格。不过这张桌子很大,我想尽快完成。 诀窍是最新的行(最大的时间戳)被添加到表的底部。所以我真的只需要找出获得最后一行的最快方法。我想在不创建索引或永久修改表或创建表的情况下执行此操作(编辑:我愿意制作视图)

我试过这个: 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)

感觉更慢了。

有什么想法吗?

【问题讨论】:

  • 您需要该列的索引
  • 对于我的一般文化,是否可以设置一个“指向”最新行的部分索引?这样的索引几乎不会占用任何空间,而且更新它是不花钱的。 PostgreSQL(或任何其他 RDBMS)是否处理​​这样的功能?
  • 在该列上创建索引
  • my_column 上的索引没有意义,请在时间戳列上创建索引。
  • 一张桌子没有底部,也没有顶部。这只是一个数据泡沫。如果您需要订单,则必须对数据进行排序。总是。如果你不这样做,你可能会很幸运,但不要指望它。

标签: sql database postgresql datatable row


【解决方案1】:

您可以使用一些小技巧,将最后插入的行保存在单独的表中。

注意,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();

我认为这是在不修改原始表(包括添加索引)的情况下插入最后一行的最快方法。

当然,如果您更新该行,事情会变得复杂 - 您还需要保持副本更新。


更简单的解决方案 - 只存储最后一个时间戳;)

【讨论】:

  • 感谢您为这个亚当付出了这么多。不幸的是,我试图尽量减少对整个数据库所做的更改。它是由一个 api 生成的,用于跟踪分析事件,我想尝试通过阅读表格来实现我的目标。
猜你喜欢
  • 2022-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2020-08-18
  • 2016-11-10
  • 1970-01-01
相关资源
最近更新 更多