我有一个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')
我想知道是否有更好,更有效的方法来处理这种类型的查询。
答案 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
的更多信息:
答案 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
;
如果您在版本字段上也有索引,此查询还为您提供速度。你也可以过滤你想要的任何东西。