Ytelse og spørringsoptimalisering i PostgreSQL · leksjon

Tolke plannoder

Lær å tolke vanlige plannoder, som sekvensielle skanninger, indeksskanninger, join-typer og sorteringer.

Leksjon 2 av 412 trinn

Tolke plannoder er en gratis leksjon i Ytelse og spørringsoptimalisering i PostgreSQL på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Ytelse og spørringsoptimalisering i PostgreSQL, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Ytelse og spørringsoptimalisering i PostgreSQL inneholder totalt 4 leksjoner.

Avkoding av spørringsplaner

Velkommen tilbake! I forrige leksjon lærte De å bruke EXPLAIN for å vise kjøringsplanen til en spørring. Nå skal vi se nærmere på hvordan De tolker de ulike «nodene» i disse planene.

Hver node representerer en bestemt operasjon som PostgreSQL utfører. Det er viktig å forstå dem for å kunne identifisere ytelsesflaskehalser.

Hva er plannoder?

Tenk på en spørringsplan som et tre, der hver gren og hvert blad er en «node». Disse nodene forteller Dem:

  • Hvilken operasjon som utføres (for eksempel skanning, sortering eller sammenføyning).
  • Hvordan den utføres (for eksempel sekvensielt eller ved hjelp av en indeks).
  • Kostnadsestimater: Hvor mye tid og ressurser PostgreSQL *forventer* at operasjonen vil kreve.

Vi skal se på de vanligste og viktigste nodetypene.

Sekvensiell skanning: full gjennomlesing

En Sequential Scan (ofte kalt «Seq Scan») betyr at PostgreSQL leser hver eneste rad i en tabell fra begynnelse til slutt for å finne dataene den trenger.

  • Når det skjer: For små tabeller, eller når De spør etter en stor del av en tabell uten en passende indeks.
  • Ytelsespåvirkning: Kan være tregt for store tabeller, særlig når det bare trengs noen få rader.

Det er som å lete gjennom hver side i en bok for å finne én setning.

Eksempel på Seq Scan

La oss se en sekvensiell skanning i praksis. Vi oppretter en enkel tabell og spør deretter mot den uten en indeks.

CREATE TABLE products (
  product_id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  price DECIMAL(10, 2)
);

INSERT INTO products (name, price) VALUES
('Laptop', 1200.00),
('Mouse', 25.00),
('Keyboard', 75.00),
('Monitor', 300.00);

EXPLAIN SELECT * FROM products WHERE price > 100;

Indeksskanning: målrettet søk

En Index Scan er langt mer effektiv. PostgreSQL bruker en indeks til raskt å finne de bestemte radene den trenger, omtrent som når De bruker en innholdsfortegnelse i en bok.

  • Når det skjer: Når en spørring bruker en WHERE-klausul på en indeksert kolonne, og indeksen er tilstrekkelig selektiv.
  • Ytelsespåvirkning: Vanligvis mye raskere enn en sekvensiell skanning for selektive spørringer mot store tabeller.

Det gjør at PostgreSQL kan hoppe direkte til de relevante datasidene.

Eksempel på Index Scan

Nå legger vi til en indeks i products-tabellen og ser på endringen i spørringsplanen.

CREATE INDEX idx_products_price ON products (price);

EXPLAIN SELECT * FROM products WHERE price > 100;

Sorteringsnode: sortering av data

Sort-noden vises når PostgreSQL må sortere data, vanligvis for en ORDER BY- eller GROUP BY-klausul, og det ikke finnes en indeks som kan levere dataene i ønsket rekkefølge.

  • Når det skjer: Ved eksplisitt ORDER BY, eller implisitt for enkelte operasjoner som GROUP BY eller unike begrensninger.
  • Ytelsespåvirkning: Sortering kan kreve mye CPU og I/O, særlig for store datasett.

Hvis sorteringen skjer «på disk» (det vil si at den ikke får plass i minnet), blir den enda tregere.

Eksempel på Sort-node

Her er et eksempel der PostgreSQL må sortere resultatene fordi det ikke finnes noen indeks for sorteringskolonnen.

EXPLAIN SELECT name, price FROM products ORDER BY name DESC;

Join-noder: sammenføyning av tabeller

Når De sammenføyer to eller flere tabeller, bruker PostgreSQL bestemte Join-noder til å kombinere dataene. Det finnes tre hovedtyper:

  • Nested Loop Join: Ofte egnet for små indre tabeller eller når en indeks er tilgjengelig.
  • Hash Join: Effektiv for større tabeller når det ikke finnes en nyttig indeks på sammenføyningsnøkkelen.
  • Merge Join: Krever at begge inndataene er sortert etter sammenføyningsnøkkelen, og fletter dem deretter sammen.

Valget avhenger av tabellstørrelser, tilgjengelige indekser og datafordeling.

Eksempel på Nested Loop Join

La oss opprette en tabell til og deretter sammenføye den med products for å se en Nested Loop Join. Dette skjer ofte når den ene siden av sammenføyningen er liten.

CREATE TABLE orders (
  order_id SERIAL PRIMARY KEY,
  product_id INT,
  quantity INT
);

INSERT INTO orders (product_id, quantity) VALUES
(1, 1),
(2, 2),
(1, 3);

EXPLAIN SELECT p.name, o.quantity
FROM products p JOIN orders o ON p.product_id = o.product_id
WHERE o.order_id = 2;

Identifiser skanningstypen

Se på følgende spørring og utdraget fra kjøringsplanen. Hvilken type skanning utføres mest sannsynlig på customers-tabellen?

EXPLAIN SELECT * FROM customers WHERE age > 30;

Delvis planutdata (anta at det ikke finnes noen indeks på age):

  ->  Seq Scan on customers  (cost=0.00..10.50 rows=3 width=...)

Oppsummering: Avkoding av plannoder

De har tatt et stort steg i forståelsen av PostgreSQL-ytelse ved å lære å tolke viktige plannoder!

  • Sequential Scan: Full gjennomlesing av tabellen, kan være tregt for store tabeller.
  • Index Scan: Bruker en indeks for målrettet tilgang til rader, og er raskere for selektive spørringer.
  • Sort: Oppstår når data må sorteres og det ikke finnes en passende indeks.
  • Join-noder: (Nested Loop, Hash, Merge) kombinerer data fra flere tabeller. Valget baseres på datamengde og indekser.

I neste leksjon skal vi bruke denne kunnskapen til å identifisere faktiske ytelsesflaskehalser!

Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
22
Leksjoner
88

Ofte stilte spørsmål

Er leksjonen «Tolke plannoder» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Ytelse og spørringsoptimalisering i PostgreSQL, inkludert «Tolke plannoder», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Ytelse og spørringsoptimalisering i PostgreSQL inneholder totalt 4 leksjoner.

Hva lærer jeg i «Tolke plannoder»?

Lær å tolke vanlige plannoder, som sekvensielle skanninger, indeksskanninger, join-typer og sorteringer. Du øver på Ytelse og spørringsoptimalisering i PostgreSQL med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Ytelse og spørringsoptimalisering i PostgreSQL?

Ingen tidligere erfaring er nødvendig. Ytelse og spørringsoptimalisering i PostgreSQL på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Tolke plannoder»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Ytelse og spørringsoptimalisering i PostgreSQL-leksjonen?

Ja. Alle Ytelse og spørringsoptimalisering i PostgreSQL-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Introduksjon til EXPLAIN og ANALYZE
  2. Tolke plannoder
  3. Identifisere ytelsesflaskehalser
  4. Lesing av kostnadsestimater og radantall i EXPLAIN
← Tilbake til Ytelse og spørringsoptimalisering i PostgreSQL