Analyse af forespørgselsplaner med EXPLAIN
Gå i dybden med brugen af EXPLAIN og EXPLAIN ANALYZE for at forstå, hvordan PostgreSQL udfører forespørgsler og bruger indekser.
Analyse af forespørgselsplaner med EXPLAIN er en gratis Avanceret PostgreSQL: Indeksering, partitionering og replikering-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Avanceret PostgreSQL: Indeksering, partitionering og replikering, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Avanceret PostgreSQL: Indeksering, partitionering og replikering-kurset indeholder 4 lektioner i alt.
Hvad er en forespørgselsplan?
Når du beder PostgreSQL om data, henter den dem ikke bare. Først finder den ud af, hvordan dataene bedst hentes. Denne »bedste måde« kaldes en forespørgselsplan.
Det er afgørende at forstå forespørgselsplaner, når du optimerer databasens ydeevne. Det hjælper dig med at se, hvordan PostgreSQL udfører dine forespørgsler og, endnu vigtigere, hvorfor nogle forespørgsler er langsomme.
Mød EXPLAIN
PostgreSQL har kommandoen EXPLAIN, som viser udførelsesplanen for enhver SQL-sætning. Det er som at kigge bag kulisserne for at se databasens strategi.
EXPLAIN kører ikke faktisk din forespørgsel. I stedet genererer den en estimeret plan baseret på tabelstatistik. Planen indeholder blandt andet oplysninger om de valgte adgangsmetoder (hvordan data læses) og joinrækkefølger.
Grundlæggende EXPLAIN-output
Lad os se EXPLAIN i aktion med en simpel forespørgsel. Vi opretter en lille tabel og beder derefter om dens plan.
Bemærk Seq Scan, som betyder »sekventiel scanning« og læser hver række i tabellen.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
INSERT INTO products (name) VALUES
('Laptop'),
('Mouse'),
('Keyboard'),
('Monitor');
EXPLAIN SELECT * FROM products WHERE name = 'Mouse';Forstå omkostninger og rækker
Outputtet fra EXPLAIN kan virke komplekst, men to vigtige målinger er cost og rows:
- cost: Et estimeret mål for, hvor ressourcekrævende forespørgslen er at udføre. Det har to tal:
{startup_cost}..{total_cost}. Startomkostningen gælder, før den første række returneres, og den samlede omkostning gælder for hele operationen. Det er relative, ikke absolutte tidsenheder. - rows: Det estimerede antal rækker, som planens knude vil levere.
Lavere omkostninger er generelt bedre, men du skal altid tage højde for det estimerede antal rækker for at vurdere nøjagtigheden.
Scanningstyper: sekventiel kontra indeks
En af de første ting, du skal se efter i en forespørgselsplan, er scanningstypen. Den fortæller, hvordan PostgreSQL får adgang til dataene:
- Sequential Scan (Seq Scan): Læser hver eneste række i tabellen én efter én. Det er effektivt for små tabeller, eller når du skal bruge det meste af tabellens data.
- Index Scan: Bruger et indeks til hurtigt at finde bestemte rækker. Det er som regel meget hurtigere for forespørgsler, der filtrerer en lille delmængde af en stor tabel.
Valget afhænger af din forespørgsel og tabelstruktur.
EXPLAIN ANALYZE: de faktiske resultater
Hvor EXPLAIN giver estimater, kører EXPLAIN ANALYZE faktisk forespørgslen og indsamler statistik fra den virkelige kørsel. Det er utroligt nyttigt til at finde flaskehalse i ydeevnen.
Den tilføjer faktiske udførelsestider og rækkeantal til planen, så du kan sammenligne estimater med virkeligheden. Store forskelle peger ofte på forældet tabelstatistik eller en uhensigtsmæssigt valgt plan.
EXPLAIN ANALYZE i aktion
Lad os oprette en større tabel og køre EXPLAIN ANALYZE på en forespørgsel, der sandsynligvis udfører en sekventiel scanning. Vær opmærksom på actual time og rows.
Vi opretter 1000 brugere og forespørger efter et bestemt aldersinterval.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(100) UNIQUE,
age INT
);
INSERT INTO users (email, age)
SELECT
'user' || i || '@example.com',
(i % 50) + 18 -- Ages from 18 to 67
FROM generate_series(1, 1000) s(i);
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 60;Se fordelene ved indeks
Nu opretter vi et indeks på kolonnen age fra vores users-tabel. Derefter kører vi den samme EXPLAIN ANALYZE-forespørgsel igen.
Du bør se en markant ændring i planen, sandsynligvis fra Seq Scan til Index Scan, samt en reduktion i den faktiske udførelsestid.
CREATE INDEX idx_users_age ON users (age);
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 60;Læsning af komplekse planer
Forespørgselsplaner kan blive meget komplekse med flere operationer. Her er nogle tips til at læse dem:
- Læs nedefra og op: PostgreSQL behandler typisk de inderste operationer (nederst) først.
- Se efter indrykning: Indrykning viser indlejrede operationer. En indre operation leverer input til sin overordnede operation.
- Find dyre knuder: Se efter knuder med høj
total_costelleractual time. Det er dine flaskehalse. - Sammenlign estimater med faktiske værdier: Store forskelle i
rowsmellemestimatedogactualkan være tegn på dårlig statistik eller en misvisende plan.
Analysér denne plan!
Se på følgende EXPLAIN-output for en forespørgsel på en tabel med navnet orders. Hvad fortæller det os om, hvordan forespørgslen vil blive udført?
Seq Scan on orders (cost=0.00..10.50 rows=5 width=100)
Filter: (amount > 100)Opsummering: Planlæg dine forespørgsler
Tillykke! Du har gennemgået PostgreSQLs forespørgselsplaner grundigt.
EXPLAINviser en estimeret forespørgselsplan.EXPLAIN ANALYZEkører forespørgslen og viser faktiske udførelsesstatistikker.- Se efter scanningstyper (Seq Scan, Index Scan) for at forstå dataadgangen.
- Sammenlign estimerede og faktiske omkostninger og rækkeantal for at finde flaskehalse.
- Læs planer nedefra og op for at følge udførelsesforløbet.
At mestre EXPLAIN er en grundsten i optimering af PostgreSQLs ydeevne. Bliv ved med at øve dig!
Lær Avanceret PostgreSQL: Indeksering, partitionering og replikering med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 11
- Lektioner
- 44
Ofte stillede spørgsmål
Er lektionen “Analyse af forespørgselsplaner med EXPLAIN” gratis?
Ja — hele teksten til “Analyse af forespørgselsplaner med EXPLAIN” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Avanceret PostgreSQL: Indeksering, partitionering og replikering-kurset, skal du opgradere til CoddyKit PRO. Avanceret PostgreSQL: Indeksering, partitionering og replikering-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Analyse af forespørgselsplaner med EXPLAIN”?
Gå i dybden med brugen af EXPLAIN og EXPLAIN ANALYZE for at forstå, hvordan PostgreSQL udfører forespørgsler og bruger indekser. Du øver dig i Avanceret PostgreSQL: Indeksering, partitionering og replikering med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Avanceret PostgreSQL: Indeksering, partitionering og replikering?
Der kræves ingen tidligere erfaring. Avanceret PostgreSQL: Indeksering, partitionering og replikering på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Analyse af forespørgselsplaner med EXPLAIN”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Avanceret PostgreSQL: Indeksering, partitionering og replikering-lektion?
Ja. Alle Avanceret PostgreSQL: Indeksering, partitionering og replikering-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Analyse af forespørgselsplaner med EXPLAIN
- Overvågning af indeksbrug
- Genindeksering og indeksvedligeholdelse
- Optimering af indeksomkostninger med ANALYZE og statistik