Warum analysiert der Vakuum-Analyse-Abfrageplan während der Analyse nicht?

8

Ich wollte die Leistung von Nur-Index-Scans in Postgres nutzen und experimentierte mit einer Tabelle:

%Vor%

Der Index deckt alle Spalten ab, die ich in der nächsten Abfrage verwenden möchte:

%Vor%

Ich überprüfe den Plan sofort nach der Erstellung:

%Vor%

Es ist seltsam, aber OK ...

In einigen Sekunden wechselt es zu einem anderen (Autovacuum?)

%Vor%

Ich versuche, es zu erzwingen, Index-only-Scan zu verwenden:

%Vor%

Aber es ändert nichts. Dann mache ich

%Vor%

Und hier bekomme ich endlich was ich will:

%Vor%

Hier sind also die Fragen:

  1. Warum lehrt analyze nicht, den großen "all-deckenden" Index zu verwenden?
  2. Warum macht vacuum analyze es?
  3. Mein Tisch war von Grund auf mit einem großen Einsatz gefüllt. Warum macht vacuum überhaupt etwas? In meinen Augen gibt es dort nichts zu vakuumieren.
greatvovan 01.09.2017, 16:09
quelle

1 Antwort

0

Analyze ist verantwortlich für das Sammeln von Statistiken und hat Auswirkungen auf die Auswahl des Abfrageplans und der Plankosten.

Indizes enthalten keine Sichtbarkeitsinformationen über die Tupel. Aus diesem Grund wird das Lesen von Datenseiten und das Filtern der Ergebnismenge ebenfalls angewendet, obwohl alle Spalten in Auswahl im Index enthalten sind. Wenn alle Tupel auf einer Seite sichtbar sind, benötigt Postgres keine zusätzlichen Filteroperationen. Postgres verwendet Visibility Map (vm), um dies zu erreichen.

Vacuum verwendet und aktualisiert auch die Sichtbarkeits-Map, während tote Tupel wiederhergestellt werden. Aus diesem Grund ändert vacuum den Abfrageplan für die Verwendung des Nur-Index-Scans nach Möglichkeit.

Ссылка

Ссылка

    
samed.yildirim 22.02.2018 11:47
quelle