-- ============================================================================= -- 01_audit_partitions.sql — inventaire RÉEL des partitions de adsb.positions -- -- Lecture seule. Ne modifie rien. -- -- reltuples = -1 signifie « jamais analysée » en PostgreSQL 16, PAS « vide ». -- Une somme à -16 (16 enfants × -1) est donc un compte INCONNU. Ce script -- compte les lignes pour de vrai avant toute décision de suppression. -- -- Usage : -- docker exec -i wordpress-postgres psql -U pgz_admin -d wpz_postgres \ -- -v ON_ERROR_STOP=1 < 01_audit_partitions.sql -- ============================================================================= \timing on -- Vue d'ensemble SELECT c.relkind, count(*) AS nb, CASE c.relkind WHEN 'r' THEN 'RANGE simple (cible)' WHEN 'p' THEN 'encore sous-partitionnée HASH' END AS etat FROM pg_inherits i JOIN pg_class c ON c.oid = i.inhrelid WHERE i.inhparent = 'adsb.positions'::regclass GROUP BY 1, 3 ORDER BY 1; -- Comptage réel de chaque partition de type 'p'. -- Sur ~127 partitions dont la plupart sont vides, l'opération est rapide : -- un count(*) sur une partition vide ne lit aucune page. CREATE TEMP TABLE audit_parts AS SELECT c.relname::text AS partition, pg_get_expr(c.relpartbound, c.oid) AS bornes, 0::bigint AS lignes FROM pg_inherits i JOIN pg_class c ON c.oid = i.inhrelid WHERE i.inhparent = 'adsb.positions'::regclass AND c.relkind = 'p'; DO $$ DECLARE r record; n bigint; BEGIN FOR r IN SELECT partition FROM audit_parts LOOP EXECUTE format('SELECT count(*) FROM adsb.%I', r.partition) INTO n; UPDATE audit_parts SET lignes = n WHERE partition = r.partition; END LOOP; END $$; -- Synthèse SELECT count(*) FILTER (WHERE lignes = 0) AS partitions_vides, count(*) FILTER (WHERE lignes > 0) AS partitions_avec_donnees, sum(lignes) AS lignes_totales_a_migrer FROM audit_parts; -- Détail des partitions contenant des données (à migrer avec copie) SELECT partition, bornes, lignes FROM audit_parts WHERE lignes > 0 ORDER BY bornes; -- Bornes extrêmes des partitions vides (à recréer sans copie) SELECT min(bornes) AS premiere_vide, max(bornes) AS derniere_vide FROM audit_parts WHERE lignes = 0; \timing off