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

Postgres:el comando de vacío no limpia las tuplas muertas

Usa VACUUM (VERBOSE) para obtener estadísticas detalladas de lo que está haciendo y por qué.

Hay tres razones por las que no se pueden eliminar las tuplas inactivas:

  1. Hay una transacción de larga ejecución que no se ha cerrado. Puedes encontrar a los chicos malos con

    SELECT pid, datname, usename, state, backend_xmin
    FROM pg_stat_activity
    WHERE backend_xmin IS NOT NULL
    ORDER BY age(backend_xmin) DESC;
    

    Puede deshacerse de una transacción con pg_cancel_backend() o pg_terminate_backend() .

  2. Hay transacciones preparadas que no se han comprometido. Puedes encontrarlos con

    SELECT gid, prepared, owner, database, transaction
    FROM pg_prepared_xacts
    ORDER BY age(transaction) DESC;
    

    Usuario COMMIT PREPARED o ROLLBACK PREPARED para cerrarlos.

  3. Hay ranuras de replicación que no se utilizan. Encuéntralos con

    SELECT slot_name, slot_type, database, xmin
    FROM pg_replication_slots
    ORDER BY age(xmin) DESC;
    

    Usa pg_drop_replication_slot() para eliminar una ranura de replicación no utilizada.