Ytelse og spørringsoptimalisering i PostgreSQL · leksjon

Optimalisere aggregater og vindusfunksjoner

Lær teknikker for effektiv behandling av komplekse aggregater og vindusfunksjoner.

Leksjon 1 av 411 trinn

Optimalisere aggregater og vindusfunksjoner er en gratis leksjon i Ytelse og spørringsoptimalisering i PostgreSQL på CoddyKit. Dette er leksjon 1 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.

Introduksjon til aggregater og vindusfunksjoner

Velkommen til optimalisering av avanserte spørringer! I dag skal vi se nærmere på hvordan De kan få aggregat- og vindusfunksjonene til å kjøre raskere.

Disse kraftige SQL-funksjonene lar Dem utføre beregninger på tvers av grupper med rader eller relaterte rader. Uten omtanke kan de imidlertid bli flaskehalser for ytelsen.

Repetisjon av aggregater

Aggregatfunksjoner oppsummerer data for en gruppe rader og returnerer én verdi per gruppe. Vanlige eksempler er COUNT(), SUM(), AVG(), MIN() og MAX().

De brukes ofte sammen med GROUP BY-setningen for å definere disse gruppene. La oss se på et enkelt eksempel:

SELECT
  category,
  COUNT(product_id) AS total_products
FROM
  products
GROUP BY
  category;

Oversikt over vindusfunksjoner

Vindusfunksjoner utfører også beregninger på tvers av et sett med tabellrader. I motsetning til aggregater slår de imidlertid ikke sammen radene. I stedet returnerer de et resultat for hver rad i den opprinnelige spørringen.

De bruker en OVER()-setning til å definere «vinduet» med rader som skal brukes i beregningen. Dette vinduet kan partisjoneres og sorteres.

Optimalisering av aggregater: tidlig filtrering

En viktig forutsetning for raske aggregater er å behandle mindre data. Filtrer alltid dataene så tidlig som mulig ved hjelp av WHERE-setningen. Dette reduserer antallet rader PostgreSQL må skanne og gruppere.

Se på dette eksempelet, der vi bare beregner aggregater for «Electronics»:

SELECT
  category,
  AVG(price) AS avg_price
FROM
  products
WHERE
  category = 'Electronics'
GROUP BY
  category;

Optimalisering av aggregater: indekser for GROUP BY

Indekser kan gjøre GROUP BY-setninger betydelig raskere. Hvis det finnes en indeks på kolonnen(e) som brukes i GROUP BY, kan PostgreSQL ofte bruke den for å unngå å sortere hele datasettet.

Dette gjelder særlig B-tree-indekser, som lagrer data i sortert rekkefølge.

CREATE INDEX idx_products_category
ON products (category);

Vindusfunksjoner: PARTITION BY

PARTITION BY-setningen i OVER() deler datasettet inn i uavhengige grupper, og vindusfunksjonen utføres separat i hver partisjon. Tenk på det som GROUP BY, men uten at radene slås sammen.

Ytelsesmessig innebærer partisjonering ofte at dataene må sorteres etter partisjonsnøkkelen(e), noe som kan kreve mye ressurser for store datasett.

SELECT
  product_name,
  category,
  price,
  AVG(price) OVER (PARTITION BY category) AS avg_category_price
FROM
  products;

Vindusfunksjoner: ORDER BY i vinduet

ORDER BY-setningen i OVER() definerer den logiske rekkefølgen på radene i hver partisjon. Dette er avgjørende for rangeringsfunksjoner (som ROW_NUMBER()) og funksjoner som avhenger av radenes rekkefølge (som LAG() og LEAD()).

Akkurat som med aggregater kan dette sorteringstrinnet være kostbart, særlig hvis det ikke finnes en egnet indeks som støtter sorteringsrekkefølgen.

SELECT
  product_name,
  category,
  price,
  ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) AS rank_in_category
FROM
  products;

Vindusrammer: ROWS og RANGE

I tillegg til PARTITION BY og ORDER BY kan De definere en spesifikk vindusramme ved hjelp av ROWS eller RANGE. Dette angir hvilket delsett av radene i den gjeldende partisjonen funksjonen skal ta hensyn til.

  • ROWS: Basert på et fast antall rader i forhold til den gjeldende raden.
  • RANGE: Basert på et verdiintervall i forhold til verdien i den gjeldende raden.

Bruk av en mindre og mer presis vindusramme (for eksempel ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) gir ofte bedre ytelse enn større, ubegrensede rammer.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  ) AS three_day_moving_avg
FROM
  sales;

Generelle optimaliseringstips

Her er noen generelle tips for både aggregater og vindusfunksjoner:

  • Bruk passende indekser: Særlig på kolonner som brukes i GROUP BY, PARTITION BY og ORDER BY.
  • Begrens datamengden: Filtrer tidlig med WHERE-setninger.
  • Unngå komplekse uttrykk: Beregninger i aggregater og vindusfunksjoner kan være trege. Beregn verdiene på forhånd hvis det er mulig.
  • Forstå datafordelingen: Skjevfordelte data kan føre til ujevn arbeidsfordeling og trege partisjoner.

Hurtigsjekk: optimalisering av aggregater

De har en stor orders-tabell og ønsker å finne totalbeløpet for ordrer som ble lagt inn i «2023-01», for hver kunde. Hvilken fremgangsmåte gir vanligvis best ytelse?

Oppsummering og neste trinn

Godt jobbet! De har lært hvordan De kan gå frem for å optimalisere både aggregat- og vindusfunksjoner.

  • Filtrer data tidlig for aggregater.
  • Bruk indekser på kolonner som brukes i GROUP BY, PARTITION BY og ORDER BY.
  • Vær oppmerksom på kostnaden ved sortering for både aggregater og vindusfunksjoner.
  • Definer presise vindusrammer med ROWS/RANGE når det er mulig.

Ha disse teknikkene i bakhodet når De skriver raskere og mer effektive PostgreSQL-spørringer!

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 «Optimalisere aggregater og vindusfunksjoner» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Ytelse og spørringsoptimalisering i PostgreSQL, inkludert «Optimalisere aggregater og vindusfunksjoner», 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 «Optimalisere aggregater og vindusfunksjoner»?

Lær teknikker for effektiv behandling av komplekse aggregater og vindusfunksjoner. 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 1 av 4.

Hvor lang tid tar leksjonen «Optimalisere aggregater og vindusfunksjoner»?

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. Optimalisere aggregater og vindusfunksjoner
  2. Rekursive CTE-er og grafspørringer
  3. Bruke materialiserte visninger for bedre ytelse
  4. Optimalisering av spørringer med FILTER og betinget aggregering
← Tilbake til Ytelse og spørringsoptimalisering i PostgreSQL