Manchmal führe ich eine Postgres-Abfrage aus, die 30 Sekunden dauert. Dann führe ich sofort dieselbe Abfrage aus und es dauert 2 Sekunden. Es scheint, dass Postgres eine Art Caching hat. Kann ich irgendwie sehen, was dieser Cache enthält? Kann ich erzwingen, dass alle Caches zu Optimierungszwecken gelöscht werden?
Hinweis: Ich suche grundsätzlich nach einer Postgres-Version des folgenden SQL Server-Befehls:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Ich würde aber auch gerne wissen, wie man sieht, was tatsächlich in diesem Puffer enthalten ist.
Vielen Dank für jede Hilfe.
quelle
Ich habe keine Befehle zum Leeren der Caches in PostgreSQL gesehen. Was Sie sehen, sind wahrscheinlich nur normale Index- und Datencaches, die von der Festplatte gelesen und im Speicher gespeichert werden. sowohl von postgresql als auch von den Caches im Betriebssystem. Um all das loszuwerden, ist der einzige Weg, den ich kenne:
Was Sie tun sollten, ist:
quelle
Greg Smiths Antwort zu drop_caches war sehr hilfreich. Ich fand es notwendig, den postgresql-Dienst zu stoppen und zu starten, zusätzlich zum Löschen der Caches. Hier ist ein Shell-Skript, das den Trick macht. (Meine Umgebung ist Ubuntu 14.04 und PostgreSQL 9.3.)
Ich habe mit einer Abfrage getestet, die beim ersten Mal 19 Sekunden und bei nachfolgenden Versuchen weniger als 2 Sekunden dauerte. Nach dem Ausführen dieses Skripts dauerte die Abfrage erneut 19 Sekunden.
quelle
Ich benutze diesen Befehl auf meiner Linux-Box:
Der Cache wird vollständig entfernt.
quelle
postgresql
, was möglicherweise nicht der Fall ist.sync
sollte nach dem Stoppen des Servers unmittelbar vorher erfolgendrop_caches
, da Postgres während des Stoppvorgangs wieder etwas schreiben kann.Ja, postgresql hat sicherlich Caching. Die Größe wird durch die Einstellung shared_buffers gesteuert . Abgesehen davon gibt es, wie in der vorherigen Antwort erwähnt, den OS-Datei-Cache, der ebenfalls verwendet wird.
Wenn Sie sich ansehen möchten, was sich im Cache befindet, steht ein Contrib-Modul namens pg_buffercache zur Verfügung (in Contrib / im Quellbaum , im Contrib-RPM oder wo immer es für die Installation angemessen ist). Die Verwendung ist in der Standarddokumentation zu PostgreSQL aufgeführt.
Es gibt keine andere Möglichkeit, den Puffercache zu löschen, als den Server neu zu starten. Sie können den Betriebssystem-Cache mit dem in der anderen Antwort genannten Befehl löschen - vorausgesetzt, Ihr Betriebssystem ist Linux.
quelle
Ich hatte diesen Fehler.
Ich suchte nach einer Spülung des aktuellen Plans und fand Folgendes:
Pläne verwerfen
Ich hatte dies zwischen meinen Einsätzen und es löst mein Problem.
quelle
DISCARD PLANS;
. Und wie in der Dokumentation angegeben: "DISCARD gibt interne Ressourcen frei, die einer Datenbanksitzung zugeordnet sind ".Ja, ist es möglich , sowohl den gemeinsam genutzte Puffer Postgres - Cache zu löschen und den OS - Cache. Die folgende Lösung ist für Windows ... andere haben die Linux-Lösung bereits angegeben.
Wie bereits erwähnt, können Sie zum Löschen der freigegebenen Puffer Postgres einfach neu starten (Server muss nicht neu gestartet werden). Wenn Sie dies jedoch tun, wird der Betriebssystem-Cache nicht geleert.
Verwenden Sie die exzellente RamMap ( https://technet.microsoft.com/en-us/sysinternals/rammap ) aus der exzellenten Sysinternals Suite , um den von Postgres verwendeten Betriebssystem-Cache nach dem Beenden des Dienstes zu löschen . Sobald Sie RamMap ausgeführt haben, klicken Sie im Hauptmenü einfach auf "Leer" -> "Leere Standby-Liste".
Starten Sie Postgres neu und Sie werden sehen, dass Ihre nächste Abfrage verdammt langsam ist, da überhaupt kein Cache vorhanden ist.
Sie können die RamMap auch ausführen, ohne Postgres zu schließen, und haben wahrscheinlich die gewünschten Ergebnisse "kein Cache", da gemeinsam genutzte Puffer, wie bereits erwähnt, im Vergleich zum Betriebssystem-Cache normalerweise nur geringe Auswirkungen haben. Aber für einen zuverlässigen Test würde ich lieber Postgres wie alle stoppen, bevor ich den Betriebssystem-Cache lösche, um sicherzugehen.
Hinweis: AFAIK, ich empfehle nicht, die anderen Dinge außer "Standby-Liste" zu löschen, wenn Sie RamMap verwenden, da die anderen Daten irgendwie verwendet werden und Sie möglicherweise Probleme / lose Daten verursachen können, wenn Sie dies tun. Denken Sie daran, dass Sie nicht nur Speicher löschen, der von Postgres-Dateien verwendet wird, sondern auch alle anderen Apps und Betriebssysteme.
Grüße, Thiago L.
quelle
Das ist meine Abkürzung
quelle
Es gibt ein
pg_buffercache
Modul, um in denshared_buffers
Cache zu schauen . Und irgendwann musste ich den Cache löschen , um einige Leistungstests für den "kalten" Cache durchzuführen , also schrieb ich eine pg_dropcache- Erweiterung, die genau dies tut. Bitte probieren Sie es aus.quelle