在多列主键中选择最后一行版本的更好方法

时间:2012-09-03 19:59:15

标签: sql postgresql

我有一个Postgres表,其中PK由UUID(id)和整数(version)组成。大多数查询都希望选择特定ID的最新版本。我现在使用的查询如下所示:

select * from dataset
where id = '0faa6a7b-587c-4106-9b1e-3cf155c2ee41' and 
version = (select max(version) from dataset where id = '0faa6a7b-587c-4106-9b1e-3cf155c2ee41')

我想知道是否有更好,更有效的方法来处理这种类型的查询。

2 个答案:

答案 0 :(得分:4)

哪种方法最快取决于索引和数据分布。 PostgreSQL中的最短(通常最快)是:

SELECT DISTINCT ON (id) *
FROM   dataset
WHERE  id = '0faa6a7b-587c-4106-9b1e-3cf155c2ee41'
ORDER  BY id, version DESC;

可以扩展为一次获取​​最新版本的多行。 对于一行,这也可以:

SELECT *
FROM   dataset
WHERE  id = '0faa6a7b-587c-4106-9b1e-3cf155c2ee41'
ORDER  version DESC
LIMIT  1;

案例的完美索引是multi-column index,如:

CREATE INDEX dataset_id_version_idx ON dataset(id, version DESC);

有关DISTINCT ON的更多信息:

Select first row in each GROUP BY group?

答案 1 :(得分:1)

你可以使用反连接,

这是一个示例,返回所有

的最新版本
SELECT
    d.*   
FROM
    "dataset" AS d
    LEFT JOIN "dataset" As d_ ON d_."id" = d."id" AND d_."version" > d."version"
WHERE
    d_."id" IS NULL
;

如果您在版本字段上也有索引,此查询还为您提供速度。你也可以过滤你想要的任何东西。