Situation: Man hat eine Tabelle mit vielen Einträgen und möchte aber einen großen Teil (z. B. alte Einträge) löschen. Problem: Ein einfaches DELETE FROM logs WHERE created_at < '2023-04-01'
kann sehr lange dauern und damit das Schreiben in die Tabelle blockieren. Ein Index hilft da leider nur bedingt.
Eine mögliche Lösung: Partitionieren der Tabelle. Indem man die Tabelle nach dem Löschkriterium partitioniert, kann man das Droppen von Einträgen deutlich beschleunigen.
Beispiel aus Postgres dazu:
CREATE TABLE logs (
-- more columns...
created_at timestamptz NOT NULL
) PARTITION BY RANGE (created_at);
CREATE TABLE logs_2023_01 PARTITION OF logs FOR VALUES
FROM ('2023-01-01 00:00:00+00') TO ('2023-01-31 23:59:59+00');
CREATE TABLE logs_2023_02 PARTITION OF logs FOR VALUES
FROM ('2023-02-01 00:00:00+00') TO ('2023-02-28 23:59:59+00');
CREATE TABLE logs_2023_03 PARTITION OF logs FOR VALUES
FROM ('2023-03-01 00:00:00+00') TO ('2023-03-31 23:59:59+00');
CREATE TABLE logs_2023_04 PARTITION OF logs FOR VALUES
FROM ('2023-04-01 00:00:00+00') TO ('2023-04-30 23:59:59+00');
ALTER TABLE logs DETACH PARTITION logs_2023_01 CONCURRENTLY;
DROP TABLE logs_2023_01;
Dieses Beispiel hab ich aus SQL-for-Devs übernommen. Dort gibt’s auch noch eine detailliertere Beschreibung sowie ein MySQL-Beispiel, wer mehr wissen möchte.