PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Was sind die verfügbaren Optionen zum Identifizieren und Entfernen der ungültigen Objekte in Postgres (z. B. beschädigte Indizes)?

Wenn Sie sich auf die Erkennung "ungültiger" (schlecht erstellter) Indizes beziehen, kann Postgres anscheinend beim Versuch, einen Index zu erstellen, "fehlschlagen", und der Abfrageplaner verwendet sie dann nicht, obwohl sie in Ihrem System vorhanden sind. Diese Abfrage erkennt "fehlgeschlagene" Indizes:

https://www.enterprisedb.com/blog/pgupgrade -bug-invalid-concurrently-created-indexes

SELECT n.nspname, c.relname
FROM   pg_catalog.pg_class c, pg_catalog.pg_namespace n,
       pg_catalog.pg_index i
WHERE  (i.indisvalid = false OR i.indisready = false) AND
       i.indexrelid = c.oid AND c.relnamespace = n.oid AND
       n.nspname != 'pg_catalog' AND
       n.nspname != 'information_schema' AND
       n.nspname != 'pg_toast'

obwohl ich annehme, dass das Erkennen von TOAST-Tabellenindizes nicht schaden würde, also können Sie diesen Teil der Abfrage entfernen :)

In Verbindung damit führt für mich manchmal auch das Ausführen einer neuen ANALYZE auf einer Tabelle dazu, dass Indizes plötzlich in der Produktion verwendet werden (d. H. Selbst wenn Indizes nicht "ungültig" sind, können sie bis zu einem ANALYZE-Lauf nicht verwendet werden). Seltsam.