Vill du veta varför en PostgreSQL-fråga är långsam? Då är EXPLAIN ANALYZE en bra utgångspunkt. Men frågeplaner kan bero på annan serveraktivitet, kan ta ett tag att köra och kan ändras över tiden, så om du vill se de faktiska exekveringsplanerna för dina långsammaste frågor är auto_explain verktyget du behöver. I det här inlägget kommer vi att undersöka vad det gör, hur man konfigurerar det och hur man använder dessa loggar för att snabba upp dina frågor.
Vad är auto_explain?
auto_explain är ett PostgreSQL-tillägg som låter dig logga frågeplanerna för frågor som är långsammare än en (konfigurerbar) tröskel. Detta är otroligt användbart för att felsöka långsamma frågor, särskilt de som bara ibland är problematiska. Det är en av bidragsmodulerna, så den kan installeras och konfigureras enkelt på vanlig PostgreSQL, och är så användbar att vi har den på som standard på ScaleGrid.
Enormt tack till Takahiro Itagaki, huvudförfattaren bakom den första versionen av auto_explain (commit, tråd), Dean Rasheed, vars första patch och förslag den baserades på, och de många bidragsgivare och recensenter sedan dess.
Vilka auto_explain-parametrar ska jag använda?
Nedan kommer vi att diskutera de viktigaste parametrarna, men vänligen gå igenom tabellen nedan eller den officiella dokumentationen för mer information om hela utbudet av saker du kan spåra.
Den viktigaste parametern för auto_explain är log_min_duration
. Som standard är detta inställt på -1
, vilket betyder att ingenting kommer att loggas – så om vi vill ha några loggar måste vi ändra det! Standardenheten är ms, så en inställning på 100
kommer att logga frågeplanerna för alla frågor som överstiger 100 ms. Detta är vad vi valde som standard i ScaleGrid, men det kan konfigureras under Admin -> Config. Om du av någon anledning vill logga frågeplanen för varje fråga kan du ställa in den på 0
– men se upp, detta kan få allvarliga prestandakonsekvenser.
Eftersom frågorna redan körs på servern vill du förmodligen också aktivera auto_explain.log_analyze
. Detta gör utdata likvärdiga med att köra EXPLAIN ANALYZE
. Som standard betyder det också att timings per operation spåras. Detta kommer med några extra kostnader, som kan minimeras genom att stänga av auto_explain.log_timing
(på som standard med log_analyze
). Naturligtvis är timings per operation mycket användbara när du felsöker långsamma frågor! Våra interna tester visade acceptabla omkostnader för detta, så det är på som standard i ScaleGrid, men som alltid vänligen testa din arbetsbelastning för att se om overheaden är acceptabel i ditt fall. Det finns för närvarande begränsad allmänt tillgänglig information om detta ämne, men ett nyligen inlägg av pgMustard-teamet visade att, åtminstone på en liten transaktionsarbetsbelastning, kan omkostnaderna vara så låga som 2%. Som de noterade kunde detta minskas med auto_explain.sample_rate
parameter, till priset av att endast spåra en delmängd av dina frågor.
Den sista parametern som vi kommer att diskutera lite i detalj är auto_explain.log_format
. Standardutgången är TEXT, vilket troligen är det du är mest bekant med genom att använda EXPLAIN
.
Här är ett enkelt exempel på hur auto_explain-utdata i TEXT-format kan se ut:
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
Du kan se här att du får frågelängden i början, vilket du kanske är van vid att se i slutet av frågeplanerna vanligtvis. Du kommer också att se frågetexten, inklusive eventuella parametrar.
De populära visualiseringsverktygen explain.depesz och explain.dalibo accepterar båda frågeplaner i TEXT-format, men båda stöder även JSON-format. Om några i ditt team föredrar att använda verktyg som PEV och pgMustard, som bara stöder JSON-formatet, kanske du vill ställa in det som formatet. För kunder på ScaleGrid valde vi JSON-formatet, delvis eftersom vi ville analysera det lättare för vår egen funktion för långsam frågeanalys.
Här är en fullständig lista över parametrarna för auto_explain och deras standardinställningar:
Parameter | PostgreSQL-standardinställningar | ScaleGrid standardinställningar |
---|---|---|
auto_explain.log_min_duration | -1 | 100 |
auto_explain.log_analyze | Av | På |
auto_explain.log_timing | På (med log_analyze) | På |
auto_explain.log_buffers | Av | På |
auto_explain.log_verbose | Av | På |
auto_explain.log_triggers | Av | Av |
auto_explain.log_nested_statements | Av | Av |
auto_explain.log_settings (v12) | Av | Av |
auto_explain.log_wal (v13) | Av | Av |
auto_explain.log_format | TEXT | JSON |
auto_explain.log_level | LOGG | LOGG |
auto_explain.sample_rate | 1 | 1 |
Installerar auto_explain
På ScaleGrid är auto_explain på som standard, med ett tröskelvärde på 100 ms. Du kan konfigurera detta under Admin -> Konfig.
På vanilla PostgreSQL kan du installera auto_explain genom att helt enkelt lägga till det i ett av session_preload_libraries
eller shared_preload_libraries
. Det förstnämnda har fördelarna av att a) inte kräver omstart (men det kommer bara att laddas i nya sessioner) och b) gör det möjligt att aktivera det endast för vissa användare (genom att ställa in denna parameter med ALTER ROLE SET ).
Som sådan kan en grundläggande konfigurationskonfiguration för auto_explain se ut så här:
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
Om du använder en annan värdleverantör är det värt att kontrollera om de stöder auto_explain. Till exempel gör RDS Postgres det, men till skillnad från ScaleGrid är det avstängt som standard, så du måste redigera konfigurationen för att få den att köras.
Laddar in auto_explain i en enda session
Om du inte vill att auto_explain ska köras i sessioner automatiskt, har du som superanvändare också möjlighet att ladda den i en enda session:
LOAD 'auto_explain';
Detta kan vara otroligt användbart för enstaka felsökningssessioner men är naturligtvis onödigt om du redan kan ha det igång.
auto_explain-begränsningar och gotchas
Vi har redan nämnt några av dessa i förbigående, men det verkar vara en rimlig tid att påminna oss om några av nackdelarna och begränsningarna med auto_explain.
För det första, särskilt när man spårar timings per operation, kan det finnas mätbara kostnader för att använda auto_explain. Det kan vara lågt, även när tider mäts, men som alltid är det värt att göra dina egna tester.
För det andra är timings för auto_explain exklusive frågeplaneringstid. Planeringstiden är ofta liten vid långsamma frågor, men i undantagsfall kan den stå för huvuddelen av problemet. Som sådan, kom ihåg att dessa fall kanske inte visas i dina loggar, eller om de gör det kan en avvikelse med vad du ser i total latens ha att göra med planeringstiden. En manuell EXPLAIN ANALYZE
hjälper dig snabbt att upptäcka detta.
Hur man använder förklarande utdata för att snabba upp frågor
När du har förklarat utdata för dina långsammaste frågor kan du nu börja undersöka hur du snabbar upp dem!
Du måste få ut frågeplanerna från loggarna, som du kan använda pgBadger för om du inte använder en hanterad tjänst som gör detta åt dig.
Att granska EXPLAIN-planer är ett stort ämne i sig. PostgreSQL-dokumentationen innehåller en bra men kort introduktion till att använda EXPLAIN, och Thoughbots artikel om att läsa EXPLAIN ANALYZE är ett bra nästa steg. Om du föredrar ett timmes långt föredrag var EXPLAIN Explained by Josh Berkus utmärkt. För mer information har Depesz en serie inlägg som heter Explaining the unexplainable och pgMustard-teamet har en ganska omfattande EXPLAIN-ordlista.
Om du behöver hjälp från PostgreSQL-experter för att hantera dina databaser och snabba upp dina långsamma frågor, ge ScaleGrid ett försök. Vi tillhandahåller gratis 24/7 support på företagsnivå som kan guida dig genom dessa långsamma frågor och hjälpa dig att få dem alla optimerade. Vår kostnadsfria 30-dagars provperiod ger dig gott om tid att prova våra många funktioner för PostgreSQL och våra andra databaser som stöds.
Vi hoppas att detta ger dig allt du behöver för att komma igång med auto_explain och börja påskynda alla långsamma frågor du har. Om det är något mer du vill veta, hör av dig.