我继承的应用程序的目的是说"自然记录流程"在PostgreSQL表中,有一个Delphi代码:
query.Open('SELECT * FROM TheTable');
query.Last();
任务是获取最后一个表记录的所有字段。我决定以更有效的方式重写此查询,如下所示:
SELECT * FROM TheTable ORDER BY ReportDate DESC LIMIT 1
但它打破了所有的工作流程。一些ReportDate记录证明是NULL。该应用程序真正面向"自然"记录表中的顺序。
如果没有ORDER BY,如何有效地进行实际的最后一次记录选择?
答案 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。因此,检查最新的物理行将在大型数据集上显得很节省