我有一个由 Postgres (v11) 数据库和一个主表支持的 Web 应用程序,其中表中的每一行都可以被视为一个对象,每一列都是对象的一个字段。
所以我们有:
| id | name | field1 | field2| .... | field 100|
-----------------------------------------------
| 1 | foo | 12.2 | blue | .... | 13.7 |
| 2 | bar | 22.1 | green | .... | 78.0 |
该表是使用以下方法创建的:
CREATE TABLE records(
id VARCHAR(50) PRIMARY KEY,
name VARCHAR(50),
field1 NUMERIC,
field2 VARCHAR(355),
field100 NUMERIC);
现在我有一个审计表,它存储每个对象的每个字段的更新。审计表定义为:
| timestamp | objid | fieldname | oldval | newval |
-----------------------------------------------
| 1234 | 1 | field2 | white | blue |
| 1367 | 1 | field1 | "11.5" | "12.2" |
| 1372 | 2 | field1 | "11.9" | "22.1" |
| 1387 | 1 | name | baz | foo |
该表是使用以下方法创建的:
CREATE TABLE audit_log(
timestamp TIMESTAMP,
objid VARCHAR (50) REFERENCES records(id),
fieldname VARCHAR (50) NOT NULL,
oldval VARCHAR(355),
newval VARCHAR(355));
oldval
/newval
被保留,varchar
因为它们纯粹是为了审计目的,所以实际的数据类型并不重要。
由于显而易见的原因,这张表在过去几年左右变得很大,所以我想删除一些旧数据。有人建议只保留每个对象的最后 5 次更新(即 UI 可以显示审计表中的最后 5 次更新)。
我知道您可以使用 aGROUP BY
和 a来获得它,LIMIT
但问题是我有一百万多个对象,其中一些已经更新了一千多次,而另一些多年来几乎没有更新。并且审计日志的读/写非常繁重(正如预期的那样)。
删除每个对象的第 5 次最新更新之前的所有条目的最佳方法是什么(当然,理想情况下,我会将其移到某个辅助存储中)?