3

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/newvalvarchar純粋に監査目的であるため、実際のデータ型は重要ではありません。

明らかな理由から、このテーブルはここ数年ほどで大きくなったので、古いデータをいくつか削除したいと思いました。誰かが、すべてのオブジェクトの最後の 5 つの更新のみを保持することを提案しました (つまり、UI は、監査テーブルから最後の 5 つの更新を表示できます)。

GROUP BYaと aを使用してこれを取得できることは理解していますLIMITが、問題は、100 万以上のオブジェクトがあり、1000 回以上更新されたものもあれば、数年にわたってほとんど更新されていないものもあります。また、監査ログの読み取り/書き込みが非常に多くなっています (予想どおり)。

各オブジェクトの 5 番目の最新の更新よりも古いすべてのエントリを削除する最善の方法は何でしょうか (もちろん、理想的にはそれをセカンダリ ストレージに移動します)。

4

3 に答える 3