不使用ORDER BY选择实际上最后一条记录

时间:2017-08-18 05:01:24

标签: postgresql

我继承的应用程序的目的是说"自然记录流程"在PostgreSQL表中,有一个Delphi代码:

query.Open('SELECT * FROM TheTable');
query.Last();

任务是获取最后一个表记录的所有字段。我决定以更有效的方式重写此查询,如下所示:

SELECT * FROM TheTable ORDER BY ReportDate DESC LIMIT 1

但它打破了所有的工作流程。一些ReportDate记录证明是NULL。该应用程序真正面向"自然"记录表中的顺序。

如果没有ORDER BY,如何有效地进行实际的最后一次记录选择?

1 个答案:

答案 0 :(得分:1)

要进行实际的最后一次记录选择,你应该使用ctid - 元组id来获取最后一个 - 只需选择max(ctid)。像是:

t=# select ctid,* from t order by ctid desc limit 1;
  ctid  |               t               
--------+-------------------------------
 (5,50) | 2017-06-13 11:41:04.894666+00
(1 row)

并且在没有order by的情况下执行此操作:

t=# select t from t where ctid = (select max(ctid) from t);
               t               
-------------------------------
 2017-06-13 11:41:04.894666+00
(1 row)

值得知道的是,只有在顺序扫描后才能找到ctid。因此,检查最新的物理行将在大型数据集上显得很节省