Ich habe Schwierigkeiten, Erklärungen zu finden, wie Indizes in PostgreSQL zwischengespeichert werden. Daher möchte ich eine Überprüfung der Realität einiger oder aller dieser Annahmen:
- PostgreSQL-Indizes befinden sich wie Zeilen auf der Festplatte, können jedoch zwischengespeichert werden.
- Ein Index befindet sich möglicherweise vollständig oder überhaupt nicht im Cache.
- Ob es zwischengespeichert wird oder nicht, hängt davon ab, wie oft es verwendet wird (wie vom Abfrageplaner definiert).
- Aus diesem Grund werden die meisten "vernünftigen" Indizes die ganze Zeit im Cache sein.
- Die Indizes befinden sich im selben Cache (dem
buffer cache
?) Wie die Zeilen. Daher steht der von einem Index verwendete Cache-Speicher für Zeilen nicht zur Verfügung.
Meine Motivation, dies zu verstehen, ergibt sich aus einer anderen Frage, die ich gestellt habe, wo vorgeschlagen wurde, Teilindizes zu erstellen für Tabellen zu verwenden, auf die ein Großteil der Daten niemals zugreifen wird.
Bevor ich dies unternehme, möchte ich klarstellen, dass die Verwendung eines Teilindex zwei Vorteile bringt:
- Wir reduzieren die Größe des Index im Cache, um mehr Platz für die Zeilen im Cache zu schaffen.
- Wir reduzieren die Größe des B-Baums, was zu einer schnelleren Antwort auf Anfragen führt.
postgresql
performance
index-tuning
cache
dukedave
quelle
quelle
Antworten:
Wenn ich ein bisschen mit pg_buffercache spiele , könnte ich Antworten auf einige Ihrer Fragen bekommen.
pg_buffercache
zeigt, lautet die Antwort definitiv JA . Es ist zu beachten, dass temporäre Tabellendaten hier nicht zwischengespeichert werden.BEARBEITEN
Ich habe Jeremiah Peschkas großartigen Artikel über Tabellen- und Indexspeicher gefunden. Mit den Informationen von dort könnte ich auch (2) antworten . Ich habe einen kleinen Test erstellt, damit Sie diese selbst überprüfen können.
Alles in allem zeigt dies, dass Indizes und Tabellen Seite für Seite zwischengespeichert werden können, daher lautet die Antwort für (2) NEIN .
Und eine letzte, um zu veranschaulichen, dass temporäre Tabellen hier nicht zwischengespeichert sind:
quelle
temp_buffers
) - für die gesamte Tabelle oder nur für den Teil auf der Festplatte. Letzteres würde ich erwarten. Könnte ein interessanter Test sein.Indexseiten werden abgerufen, wenn eine Abfrage entscheidet, dass sie nützlich sind, um die zum Beantworten einer Abfrage erforderliche Menge an Tabellendaten zu reduzieren. Es werden nur die zu diesem Zweck navigierten Blöcke des Index eingelesen. Ja, sie werden in denselben Pool shared_buffers abgelegt, in dem die Tabellendaten gespeichert sind. Beide werden auch vom Cache des Betriebssystems als zweite Cache-Ebene unterstützt.
Sie können leicht 0,1% eines Index im Speicher haben oder 100% davon. Die Idee, dass die meisten "vernünftigen" Indizes die ganze Zeit im Cache gespeichert sein werden, fällt schwer, wenn Sie Abfragen haben, die nur eine Teilmenge einer Tabelle berühren. Ein häufiges Beispiel ist, wenn Sie zeitorientierte Daten haben. Diese navigieren häufig am letzten Ende der Tabelle und sehen selten die alte Geschichte. Dort finden Sie möglicherweise alle Indexblöcke, die zum Navigieren zu und um das zuletzt verwendete Ende im Speicher erforderlich sind, während sich nur wenige befinden, die zum Navigieren zu früheren Datensätzen erforderlich sind.
Die komplizierten Teile der Implementierung sind nicht, wie Blöcke in den Puffercache gelangen. Es sind die Regeln, wann sie gehen. Mein Vortrag über den PostgreSQL-Puffercache und die darin enthaltenen Beispielabfragen können Ihnen dabei helfen, zu verstehen, was dort vor sich geht und was sich wirklich auf einem Produktionsserver ansammelt. Es kann überraschend sein. Zu all diesen Themen gibt es in meinem PostgreSQL 9.0 High Performance- Buch noch viel mehr.
Teilindizes können hilfreich sein, da sie die Größe des Index verringern und daher schneller navigieren und mehr Arbeitsspeicher für die Zwischenspeicherung anderer Dinge lassen. Wenn Ihre Navigation im Index so ist, dass sich die von Ihnen berührten Teile ohnehin immer im RAM befinden, ist dies möglicherweise keine echte Verbesserung.
quelle