sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo encuentra el recuento de filas para todas sus tablas en Postgres?

Hay tres formas de obtener este tipo de conteo, cada una con sus propias compensaciones.

Si desea un conteo verdadero, debe ejecutar la instrucción SELECT como la que usó contra cada tabla. Esto se debe a que PostgreSQL mantiene la información de visibilidad de la fila en la fila misma, no en ningún otro lugar, por lo que cualquier recuento preciso solo puede ser relativo a alguna transacción. Obtiene un recuento de lo que ve esa transacción en el momento en que se ejecuta. Puede automatizar esto para que se ejecute en todas las tablas de la base de datos, pero probablemente no necesite ese nivel de precisión ni desee esperar tanto tiempo.

El segundo enfoque señala que el recopilador de estadísticas rastrea aproximadamente cuántas filas están "activas" (no eliminadas ni obsoletas por actualizaciones posteriores) en cualquier momento. Este valor puede variar un poco con mucha actividad, pero generalmente es una buena estimación:

SELECT schemaname,relname,n_live_tup 
  FROM pg_stat_user_tables 
  ORDER BY n_live_tup DESC;

Eso también puede mostrarle cuántas filas están muertas, lo que en sí mismo es un número interesante para monitorear.

La tercera forma es tener en cuenta que el comando ANALIZAR del sistema, que el proceso de vacío automático ejecuta regularmente a partir de PostgreSQL 8.3 para actualizar las estadísticas de la tabla, también calcula una estimación de fila. Puedes agarrarlo así:

SELECT 
  nspname AS schemaname,relname,reltuples
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE 
  nspname NOT IN ('pg_catalog', 'information_schema') AND
  relkind='r' 
ORDER BY reltuples DESC;

Es difícil decir cuál de estas consultas es mejor usar. Normalmente tomo esa decisión en función de si hay información más útil que también quiero usar dentro de pg_class o dentro de pg_stat_user_tables. Para fines básicos de conteo, solo para ver qué tan grandes son las cosas en general, ambos deben ser lo suficientemente precisos.