Möchten Sie wissen, warum eine PostgreSQL-Abfrage langsam ist? Dann ist EXPLAIN ANALYZE ein guter Ausgangspunkt. Abfragepläne können jedoch von anderen Serveraktivitäten abhängen, ihre Ausführung kann eine Weile dauern und sich im Laufe der Zeit ändern. Wenn Sie also die tatsächlichen Ausführungspläne Ihrer langsamsten Abfragen sehen möchten, ist auto_explain das Tool, das Sie brauchen. In diesem Beitrag sehen wir uns an, was es tut, wie es konfiguriert wird und wie Sie diese Protokolle verwenden können, um Ihre Abfragen zu beschleunigen.
Was ist auto_explain?
auto_explain ist eine PostgreSQL-Erweiterung, mit der Sie die Abfragepläne für Abfragen protokollieren können, die langsamer als ein (konfigurierbarer) Schwellenwert sind. Dies ist unglaublich nützlich, um langsame Abfragen zu debuggen, insbesondere solche, die nur manchmal problematisch sind. Es ist eines der Beitragsmodule, kann also einfach auf normalem PostgreSQL installiert und konfiguriert werden und ist so nützlich, dass wir es standardmäßig auf ScaleGrid aktiviert haben.
Ein großes Dankeschön an Takahiro Itagaki, den Hauptautor hinter der ersten Version von auto_explain (Commit, Thread), Dean Rasheed, dessen ursprünglicher Patch und Vorschlag darauf basierte, und den vielen seither Mitwirkende und Rezensenten.
Welche auto_explain-Parameter sollte ich verwenden?
Unten werden wir die wichtigsten Parameter besprechen, aber bitte sehen Sie sich die Tabelle unten oder die offizielle Dokumentation an, um weitere Informationen über die gesamte Palette der Dinge zu erhalten, die Sie verfolgen können.
Der wichtigste Parameter für auto_explain ist log_min_duration
. Standardmäßig ist dies auf -1
eingestellt , was bedeutet, dass nichts protokolliert wird – wenn wir also einige Protokolle wollen, müssen wir sie ändern! Die Standardeinheit ist ms, also eine Einstellung von 100
protokolliert die Abfragepläne für alle Abfragen, die 100 ms überschreiten. Dies haben wir in ScaleGrid als Standard gewählt, aber es kann unter Admin -> Config konfiguriert werden. Wenn Sie aus irgendeinem Grund den Abfrageplan für jede Abfrage protokollieren möchten, können Sie dies auf 0
setzen – aber Vorsicht, dies kann schwerwiegende Auswirkungen auf die Leistung haben.
Da die Abfragen bereits auf dem Server ausgeführt werden, möchten Sie wahrscheinlich auch auto_explain.log_analyze
aktivieren . Dadurch entspricht die Ausgabe der Ausführung von EXPLAIN ANALYZE
. Standardmäßig bedeutet dies auch, dass die Timings pro Vorgang verfolgt werden. Dies bringt zusätzlichen Overhead mit sich, der durch Deaktivieren von auto_explain.log_timing
minimiert werden kann (standardmäßig aktiviert mit log_analyze
). Natürlich sind Timings pro Vorgang beim Debuggen langsamer Abfragen sehr nützlich! Unsere internen Tests haben dafür akzeptable Overheads ergeben, daher ist es in ScaleGrid standardmäßig aktiviert, aber wie immer testen Sie bitte Ihre Workload, um zu sehen, ob der Overhead in Ihrem Fall akzeptabel ist. Derzeit gibt es nur begrenzt öffentlich verfügbare Informationen zu diesem Thema, aber ein kürzlich veröffentlichter Beitrag des pgMustard-Teams zeigte, dass der Overhead zumindest bei einer kleinen Transaktionslast nur 2 % betragen kann. Wie sie feststellten, könnte dies mit auto_explain.sample_rate
reduziert werden Parameter, auf Kosten der Verfolgung nur einer Teilmenge Ihrer Abfragen.
Der letzte Parameter, den wir ein wenig im Detail besprechen werden, ist auto_explain.log_format
. Die Standardausgabe ist TEXT, was Ihnen wahrscheinlich am besten durch die Verwendung von EXPLAIN
vertraut ist .
Hier ist ein einfaches Beispiel dafür, wie die auto_explain-Ausgabe im TEXT-Format aussehen kann:
2021-09-10 15:32:04.606 BST [22770] LOG: duration: 3184.383 ms plan: Query Text: select * from table1 order by column1; Sort (cost=12875.92..13125.92 rows=100000 width=37) (actual time=2703.799..3055.401 rows=100000 loops=1) Sort Key: column1 Sort Method: external merge Disk: 4696kB Buffers: shared hit=837, temp read=587 written=589 -> Seq Scan on table (cost=0.00..1834.01 rows=100000 width=37) (actual time=0.033..27.795 rows=100000 loops=1) Buffers: shared hit=834
Sie können hier sehen, dass Sie am Anfang die Abfragedauer erhalten, die Sie normalerweise am Ende von Abfrageplänen sehen. Sie sehen auch den Abfragetext, einschließlich aller Parameter.
Die beliebten Visualisierungstools „explain.depesz“ und „explain.dalibo“ akzeptieren beide Abfragepläne im TEXT-Format, aber beide unterstützen auch das JSON-Format. Wenn einige Mitglieder Ihres Teams lieber Tools wie PEV und pgMustard verwenden, die nur das JSON-Format unterstützen, möchten Sie vielleicht dieses als Format festlegen. Für Kunden von ScaleGrid haben wir uns für das JSON-Format entschieden, teilweise weil wir es für unsere eigene langsame Abfrageanalysefunktion einfacher parsen wollten.
Hier ist eine vollständige Liste der auto_explain-Parameter und ihrer Standardwerte:
Parameter | PostgreSQL-Standardwerte | ScaleGrid defaults |
---|---|---|
auto_explain.log_min_duration | -1 | 100 |
auto_explain.log_analyze | Aus | Ein |
auto_explain.log_timing | Ein (mit log_analyze) | Ein |
auto_explain.log_buffers | Aus | Ein |
auto_explain.log_verbose | Aus | Ein |
auto_explain.log_triggers | Aus | Aus |
auto_explain.log_nested_statements | Aus | Aus |
auto_explain.log_settings (v12) | Aus | Aus |
auto_explain.log_wal (v13) | Aus | Aus |
auto_explain.log_format | TEXT | JSON |
auto_explain.log_level | LOG | LOG |
auto_explain.sample_rate | 1 | 1 |
Installation von auto_explain
Auf ScaleGrid ist auto_explain standardmäßig aktiviert, mit einem Schwellenwert von 100 ms. Dies können Sie unter Admin -> Config.
konfigurierenAuf Vanilla PostgreSQL können Sie auto_explain einfach installieren, indem Sie es zu einer der session_preload_libraries
hinzufügen oder shared_preload_libraries
. Ersteres hat die Vorteile, dass a) kein Neustart erforderlich ist (aber es wird nur in neuen Sitzungen geladen) und b) es möglich ist, es nur für einige Benutzer zu aktivieren (durch Setzen dieses Parameters mit ALTER ROLE SET
).
Als solches könnte eine grundlegende Konfiguration für auto_explain so aussehen:
session_preload_libraries = auto_explain auto_explain.log_min_duration = 100 auto_explain.log_analyze = true auto_explain.log_buffers = true auto_explain.log_format = JSON
Wenn Sie einen anderen Hosting-Anbieter verwenden, lohnt es sich zu prüfen, ob dieser auto_explain unterstützt. Beispielsweise RDS Postgres, aber im Gegensatz zu ScaleGrid ist es standardmäßig deaktiviert, sodass Sie die Konfiguration bearbeiten müssen, um es zum Laufen zu bringen.
Laden von auto_explain in eine einzelne Sitzung
Wenn Sie nicht möchten, dass auto_explain automatisch in Sitzungen ausgeführt wird, haben Sie als Superuser auch die Möglichkeit, es in eine einzelne Sitzung zu laden:
LOAD 'auto_explain';
Dies kann für einmalige Debugging-Sitzungen unglaublich nützlich sein, ist aber natürlich unnötig, wenn Sie es bereits ausführen können.
auto_explain Einschränkungen und Fallstricke
Einige davon haben wir bereits nebenbei erwähnt, aber es scheint ein vernünftiger Zeitpunkt, uns an einige der Nachteile und Einschränkungen von auto_explain zu erinnern.
Erstens kann die Verwendung von auto_explain einen messbaren Overhead mit sich bringen, insbesondere wenn das Timing pro Vorgang verfolgt wird. Es kann niedrig sein, selbst wenn die Timings gemessen werden, aber wie immer lohnt es sich, eigene Tests durchzuführen.
Zweitens beinhalten auto_explain-Timings keine Abfrageplanungszeit. Die Planungszeit ist bei langsamen Abfragen oft winzig, kann aber in Ausnahmefällen für den Großteil des Problems verantwortlich sein. Denken Sie daher daran, dass diese Fälle möglicherweise nicht in Ihren Protokollen angezeigt werden, oder wenn dies der Fall ist, eine Diskrepanz mit dem, was Sie in der Gesamtlatenz sehen, möglicherweise mit der Planungszeit zu tun hat. Eine manuelle EXPLAIN ANALYZE
wird Ihnen schnell dabei helfen, dies zu erkennen.
Wie man die EXPLAIN-Ausgabe verwendet, um Abfragen zu beschleunigen
Sobald Sie die EXPLAIN-Ausgabe für Ihre langsamsten Abfragen haben, können Sie nun damit beginnen, sie zu beschleunigen!
Sie müssen die Abfragepläne aus den Protokollen abrufen, wofür Sie pgBadger verwenden können, wenn Sie keinen verwalteten Dienst verwenden, der dies für Sie erledigt.
P>Die Überprüfung von EXPLAIN-Plänen ist ein großes Thema für sich. Die PostgreSQL-Dokumentation enthält eine gute, aber kurze Einführung in die Verwendung von EXPLAIN, und der Artikel von Thoughbot zum Lesen von EXPLAIN ANALYZE ist ein guter nächster Schritt. Wenn Sie ein einstündiges Gespräch bevorzugen, war EXPLAIN Explained von Josh Berkus ausgezeichnet. Für weitere Informationen hat Depesz eine Reihe von Posts mit dem Titel Explaining the Unexplainable und das pgMustard-Team hat ein ziemlich umfassendes EXPLAIN-Glossar.
Wenn Sie Hilfe von PostgreSQL-Experten benötigen, um Ihre Datenbanken zu verwalten und Ihre langsamen Abfragen zu beschleunigen, probieren Sie ScaleGrid aus. Wir bieten kostenlosen 24/7-Support auf Unternehmensebene, der Sie durch diese langsamen Abfragen führen und Ihnen helfen kann, sie alle zu optimieren. Unsere kostenlose 30-Tage-Testversion gibt Ihnen ausreichend Zeit, um unsere vielen Funktionen für PostgreSQL und unsere anderen unterstützten Datenbanken auszuprobieren.
Wir hoffen, dass Sie damit alles haben, was Sie brauchen, um mit auto_explain loszulegen und Ihre langsamen Abfragen zu beschleunigen. Wenn Sie noch etwas wissen möchten, setzen Sie sich mit uns in Verbindung.