一尘不染

使用Postgresql进行高效的最新记录查询

sql

我需要做一个大查询,但是我只想要最新记录。

对于单个条目,我可能会做类似的事情

SELECT * FROM table WHERE id = ? ORDER BY date DESC LIMIT 1;

但是我需要提取大量(数千个条目)记录的最新记录,而仅获取最新记录。

这就是我所拥有的。这不是很有效。我想知道是否有更好的方法。

SELECT * FROM table a WHERE ID IN $LIST AND date = (SELECT max(date) FROM table b WHERE b.id = a.id);

阅读 274

收藏
2021-03-17

共1个答案

一尘不染

如果您不想更改数据模型,则可以使用DISTINCT ON来从表“ b”中获取“ a”中每个条目的最新记录:

SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC

如果要避免查询中出现“排序”,则添加这样的索引 可能会 有所帮助,但是我不确定:

CREATE INDEX b_id_date ON b (id, date DESC)

SELECT DISTINCT ON (b.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY b.id, b.date DESC

或者,如果您想以某种方式对表“ a”中的记录进行排序:

SELECT DISTINCT ON (sort_column, a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY sort_column, a.id, b.date DESC

替代方法

但是,以上所有查询仍然需要从表“ b”中读取 所有引用的行 ,因此,如果您有大量数据,它可能仍然太慢。

您可以创建一个新表,该表仅保存每个表的最新“ b”记录a.id-甚至可以将这些列移到“ a”表本身中。

2021-03-17