Tengo una tabla y necesito obtener la última celda de una columna en ella. Sin embargo, la mesa es grande y quiero hacerlo lo más rápido posible. El truco es que las filas más nuevas (marca de tiempo más grande) se agregan al final de la tabla. Así que realmente solo necesito encontrar la forma más rápida de obtener la última fila. Me gustaría hacer esto sin hacer un índice o modificar permanentemente la tabla o crear tablas (EDITAR: estoy abierto a hacer vistas)
Intenté esto: SELECT my_column FROM my_schema.my_table ORDER by timestamp DESC NULLS LAST LIMIT 1 pero fue muy lento para la tabla grande
así que probé esto: SELECT my_column FROM my_schema.my_table WHERE timestamp=(select max(timestamp) from my_schema.my_table)
y se sintió aún más lento.
¿Alguna idea?
Podría usar una forma un poco complicada y mantener su última fila insertada en una tabla separada.
Tenga en cuenta que la consulta INSERT puede devolver valores:
INSERT INTO ... RETURNING *;Ahora puede usarlo y guardar una nueva fila en una tabla separada:
INSERT INTO my_schema.my_table_last_row(INSERT INTO ... RETURNING *); La tabla my_table_last_row debe tener las mismas columnas (o simplemente puede INHERIT de la tabla original).
Podría usar un disparador ON INSERT para hacer el trabajo.
CREATE OR REPLACE FUNCTION remember_last_row() RETURNS trigger AS $BODY$ BEGIN TRUNCATE my_schema.my_table_last_row; INSERT INTO my_schema.my_table_last_row VALUES(NEW.*); RETURN NEW; END; $BODY$ CREATE TRIGGER remember_last_row_trigger BEFORE INSERT ON my_schema.my_table FOR EACH ROW EXECUTE PROCEDURE remember_last_row();Creo que esta es la forma más rápida de insertar la última fila sin modificar la tabla original (incluida la adición de un índice).
Por supuesto, las cosas se complican si actualiza esa fila; también deberá mantener la copia actualizada.
Solución más simple: almacene solo la última marca de tiempo;)