Postgresql
僅選擇表中的最後一行作為值列表
例如,我們有一個表:
CREATE TABLE t1 ( a BYTEA NOT NULL, r_pointer BIGINT, s_pointer BIGINT, data BYTEA, PRIMARY KEY(a, r_pointer) ) PARTITION BY HASH (a);
如果我們想得到最後一個元素:
SELECT * FROM t1 WHERE a ='\xaaa' order by r_pointer desc limit 1;
當然,我可以使用
executemany
for 這個語句,但這對性能不是很好。如何僅獲取給定數組中每個元素的第一行,例如
{\xaaa,\xbbbb}
. 類似於以下內容,但這會返回所有行:SELECT * FROM t1 WHERE a = ANY ('{\xaaa,\xbbbb}'::bytea[]) ORDER BY r_pointer DESC;
對於大表、現代 PostgreSQL(您的範例建議使用 Postgres 11,因為在此之前分區表不支持 PK)和許多輸入值,這應該表現出色:
SELECT t1.* FROM unnest('{\xaaa,\xbbbb}'::bytea[]) a CROSS JOIN LATERAL ( SELECT * FROM t1 WHERE t1.a = a.a ORDER BY t1.r_pointer DESC LIMIT 1 ) t1;
您的 PK
(a, r_pointer)
僅提供了所需的索引。有關的: