64 lines
2.2 KiB
SQL
64 lines
2.2 KiB
SQL
-- =============================================================================
|
||
-- 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
|