Como suelo olvidar con facilidad ciertas cosas y al no usar mucho del.icio.us para recordarlas, pongo aquí un artículo que encontré hace unos días por si alguien más le encuentra utilidad. 😉
En cualquier gestor de base de datos, para conocer el número de registros basta con hacer uso de la función de agregación count
.
Pero hacer esta operación en PostgreSQL sobre tablas grandes es bastante costosa porque se realiza un recorrido secuencial para obtener el número exacto de registros.
QUERY PLAN
---------------------------------------------------------------------------------------------------------
Aggregate (cost=4.50..4.51 rows=1 width=0) (actual time=0.882..0.884 rows=1 loops=1)
Total runtime: 0.963 ms
(3 filas)
Una forma de obtener el número aproximado de registros de manera rápida y sin los problemas inherentes al uso de la función count
, es haciendo una consulta a los catálogos del sistema (pg_class
):
JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid)
WHERE nspname = 'public' -- esquema
AND relname = 'actor'; -- nombre de la tabla
Para que lo anterior funcione o dé resultados más cercanos a la realidad, es necesario ejecutar ANALYZE sobre esa tabla, tarea que se debe realizar periódicamente.
3 replies on “Determinar el número de filas en PostgreSQL”
La solución me gusta, pero hay un leve problema, y es que no estaria actualizado constantemente, aunque si ayuda y mucho para tablas que no se actualizan mucho pero que aun asi son bastante grandes.
umm se me ocurre algo, no seria mas facil crear un trigger que se lance un insert incremente y cuando se lance un delete decremente un valor en una tabla de tamaños?, solo habria que inicializarlo de la siguiente forma una tabla que contuviese dos valores el primer valor de la columna se corresponderia con el nombre de la tabla y en el segundo una columna numerica
Perdón quería decir que se lanzase en el evento insert y delete, y bueno puedo equivocarme porque ultimamente en casa manejo tanto MySQL como PostgreSQL y en el curro Oracle y puede que me confunda y el tema de los trigers sea propio de Oracle pero lo dudo imagino que ambos tanto MySQL como PostgreSQL tienen dicha funcionalidad.
seria algo tan sencillo como actualizar dicha tabla con un update cada vez que se hace un insert o un delete.
Juanjo, realizar ANALYZE sobre las tablas es vital para que se escojan de mejor manera los planes de ejecución y por consiguiente se consiga un mejor desempeño en las consultas que se hacen sobre éstas.
Sobre el trigger, ciertamente funcionaría, pero crearía una sobrecarga más en las inserciones y eliminaciones.