PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment trouvez-vous le nombre de lignes pour toutes vos tables dans Postgres

Il existe trois façons d'obtenir ce type de décompte, chacune avec ses propres compromis.

Si vous voulez un vrai décompte, vous devez exécuter l'instruction SELECT comme celle que vous avez utilisée pour chaque table. En effet, PostgreSQL™ conserve les informations de visibilité des lignes dans la ligne elle-même, et nulle part ailleurs, de sorte que tout décompte précis ne peut être que relatif à une transaction. Vous obtenez un décompte de ce que cette transaction voit au moment où elle s'exécute. Vous pouvez automatiser cela pour l'exécuter sur chaque table de la base de données, mais vous n'avez probablement pas besoin de ce niveau de précision ou vous ne voulez pas attendre aussi longtemps.

La deuxième approche note que le collecteur de statistiques suit approximativement le nombre de lignes "actives" (non supprimées ou obsolètes par des mises à jour ultérieures) à tout moment. Cette valeur peut être légèrement décalée en cas d'activité intense, mais il s'agit généralement d'une bonne estimation :

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

Cela peut également vous montrer combien de lignes sont mortes, ce qui est en soi un nombre intéressant à surveiller.

La troisième façon est de noter que la commande système ANALYZE, qui est exécutée régulièrement par le processus autovacuum depuis PostgreSQL 8.3 pour mettre à jour les statistiques de la table, calcule également une estimation de ligne. Vous pouvez saisir celui-ci comme ceci :

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;

Il est difficile de dire laquelle de ces requêtes est préférable d'utiliser. Normalement, je prends cette décision en fonction de la présence d'informations plus utiles que je souhaite également utiliser à l'intérieur de pg_class ou à l'intérieur de pg_stat_user_tables. À des fins de comptage de base, juste pour voir la taille des choses en général, l'un ou l'autre devrait être suffisamment précis.