Wie mache ich einen REINDEX

Servus,

ich würde gerne meine Tabellen neu indezieren.

Im Handbuch steht das ich das mit dem Befehl REINDEX DATABASE (name) machen kann…

Ich verwende PostgreSQL 8.1.5 auf Open Suse 10.2
Nachdem ich mich als benutzer postgre angemeldet habe gab ich in psql folgendes ein:
REINDEX DATABASE mo_nsw2
worauf ich die fehlermeldung bekam:
FEHLER: aktuell geöffnete Datenbank kann nicht reindiziert werden

Wo liegt der Fehler? Kann es sein dass ich irgenwie die Datenbank mo_nsw2 stoppen muß?
Wenn ich den ganzen Dienst beende (als Admin mit rcpostgresql stop) kann ich logischerweise nicht mit psql auf die Datenbank zugreifen

Eine Frage zum Verständnis:
Nachdem ich auf eine Tabelle, in der bereits Datensätze stehen einen Index anlege, muß ich doch erstmal die Indextabelle neu aufbauen lassen?
Oder macht das PostgreSQL automatisch? (eventuell zeitlich versetzt?)


Grüße
Ingo

Warum?

Im Handbuch steht das ich das mit dem Befehl REINDEX DATABASE (name) machen kann…

Ich verwende PostgreSQL 8.1.5 auf Open Suse 10.2
Nachdem ich mich als benutzer postgre angemeldet habe gab ich in psql folgendes ein:
REINDEX DATABASE mo_nsw2
worauf ich die fehlermeldung bekam:
FEHLER: aktuell geöffnete Datenbank kann nicht reindiziert werden

Kann es sein, daß eine Transaktion offen ist?

Wo liegt der Fehler? Kann es sein dass ich irgenwie die Datenbank mo_nsw2 stoppen muß?

Nein. Ich kann das hier machen, allerdings nicht, wenn eine TX offen ist.

Wenn ich den ganzen Dienst beende (als Admin mit rcpostgresql stop) kann ich logischerweise nicht mit psql auf die Datenbank zugreifen

perfekt beobachtet.

Eine Frage zum Verständnis:
Nachdem ich auf eine Tabelle, in der bereits Datensätze stehen einen Index anlege, muß ich doch erstmal die Indextabelle neu aufbauen lassen?

Nein.

Oder macht das PostgreSQL automatisch? (eventuell zeitlich versetzt?)

Ja. Nein. (8.2 kann index concurrently)


Andreas

Das Handbuch beschreibt, das einige Indicies nicht im laufenden Betrieb neu gebaut werden können, dazu muss die Datenbank im Standalone Modus gestartet werden.

Ansonsten wäre es vielleicht praktisch, mal nur die wirklich kaputten Indicies neu zu bauen, gib vielleicht mal die Tabellennamen an.

Danke erst mal für die schnelle antwort.

Ich habe mir einen View gebastelt. Bei einem explain analyze kam dann heraus, dass auf einige der Felder der verwendetetn Tabellen kein index war.
Also habe ich dann auf die entsprechenden Spalten einen Index gesetzt. Dann habe ich wieder einen explain analyze gemacht, und er zeigte immer noch eine sequenzielle suche statt einer indexsuche an… Von daher dachte ich mir das wohl die Indextabelle neu aufgebaut werden muß…

Habe es aber gerade eben nochmal versucht und jetzt macht er die Index suche…

Dankeschön!

Also Index neubauen ist da weniger das Mittel der Wahl als ein ANALYZE oder ein VACUUM ANALYZE.

Ansonsten: PostgreSQL entscheidet dynamisch, ob es einen Index nutzt. Nicht immer würde dies Sinn machen. Als Beispiel: du hast eine Tabelle mit 5 Einträgen und einem PKey. PG stellt jetzt fest, das es zwar den Index nutzen könnte, aber in Folge sowieso die gesamte Seite von der Festplatte holen muss. Letzteres ist von den Kosten her betrachtet teurer, also wird gleich die gesamte Seite geholt. Der Zugriff im Ram ist dann vernachlässigbar.

Es kommt also auch darauf an, wie gut deine Statistiken gepflegt sind. Autovacuum spielt eine große Rolle, bei schnelllebigen Tabellen auf einem aktuellen Stand zu bleiben.

Ok,

für die Zukunft abgespeichert.