2

我有一个 Postgres 表,其中 PK 由 UUID(id)和整数(版本)组成。大多数查询都希望选择特定 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')

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

4

2 回答 2

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;

该案例的完美索引将是一个多列索引,例如:

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

更多关于DISTINCT ON

在每个 GROUP BY 组中选择第一行?

于 2012-09-04T00:23:38.220 回答
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
;

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

于 2012-09-04T00:09:45.287 回答