Postgresql

僅選擇表中的最後一行作為值列表

  • April 28, 2019

例如,我們有一個表:

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;

當然,我可以使用executemanyfor 這個語句,但這對性能不是很好。

如何僅獲取給定數組中每個元素的第一行,例如{\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)僅提供了所需的索引。

有關的:

引用自:https://dba.stackexchange.com/questions/236800