2

PKがUUID(id)と整数(バージョン)で構成されているPostgresテーブルがあります。ほとんどのクエリは、特定の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;

一度に最新バージョンで複数の行をフェッチするように拡張できます。たった1行の場合、これも同様です。

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

各GROUPBYグループの最初の行を選択しますか?

于 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 に答える