Aquí es una solución simple a esto, para casos donde el tamaño de los datos no es demasiado grande y los requisitos de rendimiento no son demasiado difíciles.
Primero, creemos nuestra tabla. Vamos a tener una columna de identificación y una columna de datos, pero puede tener las columnas que necesite para su situación particular.
CREATE TABLE capped_collection (
id integer NOT NULL,
data text);
Ahora, creamos una secuencia para nuestra clave primaria, fijamos el MAXVALUE
ser el tamaño deseado de la colección de cubiertas, y usamos la opción CYCLE
, por lo que la secuencia contará hasta MAXVALUE
y reinicie de nuevo 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;
en el siguiente paso (no mostrado aquí), que debe pre-semilla de la mesa con MAXVALUE
registros. Hacemos esto para que cada valor de identificación tenga una fila, y no tenemos que preocuparnos de decidir si hacemos una operación INSERTAR o ACTUALIZAR, solo para mantener las cosas simples y efectivas.
Ahora que la mesa está configurado, cada vez que desee insertar una nueva fila, que en cambio realiza una actualización al igual que
UPDATE capped_collection
SET data = 'your data here'
WHERE id = (SELECT nextval('capped_collection_id_seq'))
El comando nextval
no nos lleva a la siguiente identificación, y porque especificamos CYCLE
se se ajustará nuevamente a 1 una vez que llegue a MAXVALUE
. El resultado final es que solo tendrá MAXVALUE
filas en la tabla, con las entradas más antiguas con antigüedad.
(de http://www.rigelgroupllc.com/blog/2014/10/14/capped-collections-in-postgres/)
Implementar la separación y la programación dejando caer las particiones de más edad y sólo mantener el más reciente podría funcionar. Teóricamente debería funcionar mucho mejor que eliminar filas de la tabla. – Marquez