Optimering af aggregater og window functions
Lær teknikker til effektiv behandling af komplekse aggregater og window functions.
Optimering af aggregater og window functions er en gratis Ydelsesoptimering og optimering af forespørgsler i PostgreSQL-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Ydelsesoptimering og optimering af forespørgsler i PostgreSQL, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Ydelsesoptimering og optimering af forespørgsler i PostgreSQL-kurset indeholder 4 lektioner i alt.
Introduktion til aggregat- og vinduesfunktioner
Velkommen til optimering af avancerede forespørgsler! I dag ser vi nærmere på, hvordan du får dine aggregat- og vinduesfunktioner til at køre hurtigere.
Disse effektive SQL-funktioner lader dig udføre beregninger på tværs af grupper af rækker eller relaterede rækker. Uden omtanke kan de dog blive flaskehalse for ydeevnen.
Genopfriskning af aggregater
Aggregatfunktioner opsummerer data for en gruppe rækker og returnerer én værdi pr. gruppe. Almindelige funktioner omfatter COUNT(), SUM(), AVG(), MIN() og MAX().
De bruges ofte sammen med GROUP BY-sætningen til at definere disse grupper. Lad os se på et enkelt eksempel:
SELECT
category,
COUNT(product_id) AS total_products
FROM
products
GROUP BY
category;Oversigt over vinduesfunktioner
Vinduesfunktioner udfører også beregninger på tværs af et sæt tabelrækker. I modsætning til aggregater slår de dog ikke rækker sammen. I stedet returnerer de et resultat for hver række i den oprindelige forespørgsel.
De bruger en OVER()-sætning til at definere det 'vindue' af rækker, der skal bruges til beregningen. Vinduet kan opdeles i partitioner og sorteres.
Optimering af aggregater: tidlig filtrering
En vigtig forudsætning for hurtige aggregater er at behandle mindre data. Filtrér altid dine data så tidligt som muligt ved hjælp af WHERE-sætningen. Det reducerer antallet af rækker, PostgreSQL skal scanne og gruppere.
Overvej dette eksempel, hvor vi kun beregner et aggregat for 'Electronics':
SELECT
category,
AVG(price) AS avg_price
FROM
products
WHERE
category = 'Electronics'
GROUP BY
category;Optimering af aggregater: indekser til GROUP BY
Indekser kan gøre GROUP BY-sætninger betydeligt hurtigere. Hvis der findes et indeks på de kolonner, der bruges i GROUP BY, kan PostgreSQL ofte bruge det til at undgå at sortere hele datasættet.
Det gælder især B-tree-indekser, som gemmer data i sorteret rækkefølge.
CREATE INDEX idx_products_category
ON products (category);Vinduesfunktioner: PARTITION BY
PARTITION BY-sætningen i OVER() opdeler dit datasæt i uafhængige grupper, og vinduesfunktionen arbejder separat i hver partition. Tænk på det som GROUP BY, men uden at rækkerne slås sammen.
Ydeevnemæssigt indebærer partitionering ofte, at dataene sorteres efter partitionsnøglen eller -nøglerne, hvilket kan kræve mange ressourcer for store datasæt.
SELECT
product_name,
category,
price,
AVG(price) OVER (PARTITION BY category) AS avg_category_price
FROM
products;Vinduesfunktioner: ORDER BY i vinduet
ORDER BY-sætningen i OVER() definerer den logiske rækkefølge for rækkerne i hver partition. Det er afgørende for rangordningsfunktioner (f.eks. ROW_NUMBER()) og funktioner, der afhænger af rækkefølgen (f.eks. LAG() og LEAD()).
Ligesom med aggregater kan dette sorteringstrin være omkostningsfuldt, især hvis der ikke findes et passende indeks, der understøtter sorteringsrækkefølgen.
SELECT
product_name,
category,
price,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) AS rank_in_category
FROM
products;Vinduesrammer: ROWS og RANGE
Ud over PARTITION BY og ORDER BY kan du definere en specifik vinduesramme ved hjælp af ROWS eller RANGE. Det angiver, hvilket udsnit af rækkerne i den aktuelle partition funktionen skal tage i betragtning.
ROWS: Baseres på et fast antal rækker i forhold til den aktuelle række.RANGE: Baseres på et værdiinterval i forhold til værdien i den aktuelle række.
Brug af en mindre og mere præcis vinduesramme (f.eks. ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) giver ofte bedre ydeevne end større, ubegrænsede 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 optimeringstip
Her er nogle generelle tip til både aggregater og vinduesfunktioner:
- Brug passende indekser: Især på kolonner, der bruges i
GROUP BY,PARTITION BYogORDER BY. - Minimér datamængden: Filtrér tidligt med
WHERE-sætninger. - Undgå komplekse udtryk: Beregninger i aggregater og vinduer kan være langsomme. Beregn dem på forhånd, hvis det er muligt.
- Forstå datafordelingen: Skævt fordelte data kan føre til ujævn arbejdsfordeling og langsomme partitioner.
Hurtig kontrol: optimering af aggregater
Du har en stor orders-tabel og vil finde det samlede beløb for ordrer, der er placeret i '2023-01', for hver kunde. Hvilken fremgangsmåde er generelt mest effektiv?
Opsummering og næste trin
Godt arbejde! Du har lært, hvordan du kan gribe optimering af både aggregat- og vinduesfunktioner an.
- Filtrér data tidligt ved brug af aggregater.
- Brug indekser på kolonner, der bruges i
GROUP BY,PARTITION BYogORDER BY. - Vær opmærksom på omkostningerne ved sortering for både aggregater og vinduesfunktioner.
- Definér præcise vinduesrammer med
ROWS/RANGE, når det er muligt.
Hav disse teknikker i tankerne, når du skriver hurtigere og mere effektive PostgreSQL-forespørgsler!
Lær SQL 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
- 22
- Lektioner
- 88
Ofte stillede spørgsmål
Er lektionen “Optimering af aggregater og window functions” gratis?
Ja — alle 3 lektioner i læringssporet Ydelsesoptimering og optimering af forespørgsler i PostgreSQL, inklusive “Optimering af aggregater og window functions”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Ydelsesoptimering og optimering af forespørgsler i PostgreSQL-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Optimering af aggregater og window functions”?
Lær teknikker til effektiv behandling af komplekse aggregater og window functions. Du øver dig i Ydelsesoptimering og optimering af forespørgsler i PostgreSQL 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å Ydelsesoptimering og optimering af forespørgsler i PostgreSQL?
Der kræves ingen tidligere erfaring. Ydelsesoptimering og optimering af forespørgsler i PostgreSQL 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 “Optimering af aggregater og window functions”?
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 Ydelsesoptimering og optimering af forespørgsler i PostgreSQL-lektion?
Ja. Alle Ydelsesoptimering og optimering af forespørgsler i PostgreSQL-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
- Optimering af aggregater og window functions
- Rekursive CTE'er og graph-queries
- Brug af materialiserede views til bedre ydeevne
- Optimering af queries med FILTER og betinget aggregering