Ecco una soluzione semplice a questo, per i casi in cui la dimensione dei dati non è troppo grande e i requisiti di prestazione non sono troppo difficili.
In primo luogo, creiamo il nostro tavolo. Avremo una colonna id e una colonna di dati, ma puoi avere le colonne necessarie per la tua situazione specifica.
CREATE TABLE capped_collection (
id integer NOT NULL,
data text);
Ora, creiamo una sequenza per la nostra chiave primaria, impostare il MAXVALUE
essere la dimensione desiderata della nostra collezione innevate, e usiamo l'opzione CYCLE
, in modo che la sequenza conterà fino a MAXVALUE
e poi riavviare di nuovo a 1.
CREATE SEQUENCE capped_collection_id_seq
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 10000
CACHE 1
CYCLE
OWNED BY capped_collection.id;
Nella fase successiva (non mostrato qui), si dovrebbe pre-seed tavolo con MAXVALUE
record. Lo facciamo in modo che ogni valore id abbia una riga e non dobbiamo preoccuparci di decidere se eseguire un'operazione INSERT o UPDATE, solo per mantenere le cose semplici e performanti.
Ora che il nostro tavolo è impostato, ogni volta che vogliamo inserire una nuova riga, che invece fa un aggiornamento in questo modo
UPDATE capped_collection
SET data = 'your data here'
WHERE id = (SELECT nextval('capped_collection_id_seq'))
Il comando nextval
ci porta alla prossima id, e perché abbiamo specificato CYCLE
esso tornerà indietro a 1 una volta che raggiunge MAXVALUE
. Il risultato finale è che avrai sempre solo MAXVALUE
righe nella tabella, con le voci più vecchie che sono invecchiate.
(da http://www.rigelgroupllc.com/blog/2014/10/14/capped-collections-in-postgres/)
Implementare il partizionamento e far cadere a livello di codice le partizioni più grandi e solo mantenendo il più recente potrebbe funzionare. In teoria dovrebbe funzionare in modo migliore dell'eliminazione di righe dalla tabella. – Marquez