Optimalisere aggregater og vindusfunksjoner
Lær teknikker for effektiv behandling av komplekse aggregater og vindusfunksjoner.
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 BYogORDER 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 BYogORDER BY. - Vær oppmerksom på kostnaden ved sortering for både aggregater og vindusfunksjoner.
- Definer presise vindusrammer med
ROWS/RANGEnår det er mulig.
Ha disse teknikkene i bakhodet når De skriver raskere og mer effektive PostgreSQL-spørringer!
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
- Optimalisere aggregater og vindusfunksjoner
- Rekursive CTE-er og grafspørringer
- Bruke materialiserte visninger for bedre ytelse
- Optimalisering av spørringer med FILTER og betinget aggregering