Uppgradering för lata: hur PostgreSQL 12 förbÀttrar prestandan

Uppgradering för lata: hur PostgreSQL 12 förbÀttrar prestandan

PostgreSQL 12, den senaste versionen av "vĂ€rldens bĂ€sta relationsdatabas med öppen kĂ€llkod" slĂ€pps om ett par veckor (om allt gĂ„r enligt plan). Detta följer det vanliga schemat — en ny version med massor av nya funktioner slĂ€pps en gĂ„ng om Ă„ret, och Ă€rligt talat Ă€r det imponerande. DĂ€rför har jag blivit en aktiv medlem i PostgreSQL-gemenskapen.

Jag tycker att, till skillnad frÄn tidigare versioner, sÄ innehÄller PostgreSQL 12 inga enstaka revolutionerande funktioner (som partitionering eller parallell begÀran). Jag skÀmtade en gÄng om att den största grejen med PostgreSQL 12 Àr ökad stabilitet. Och Àr inte det precis vad man behöver nÀr man hanterar kritiska data för verksamheten?

Men PostgreSQL 12 stannar inte dÀr: med de nya funktionerna och förbÀttringarna kommer appar att prestera bÀttre, och allt som krÀvs av dig Àr att uppgradera!

(NÄvÀl, kanske Àven bygga om indexen, men i den hÀr versionen Àr det inte sÄ skrÀmmande som vi Àr vana vid.)

Det kommer att bli fantastiskt — att uppgradera PostgreSQL och direkt fĂ„ njuta av betydande förbĂ€ttringar utan extra anstrĂ€ngning. För nĂ„gra Ă„r sedan analyserade jag uppgraderingen frĂ„n PostgreSQL 9.4 till PostgreSQL 10 och sĂ„g hur applikationen accelererade tack vare förbĂ€ttrad parallellism av förfrĂ„gningar i PostgreSQL 10. Och viktigast av allt, det krĂ€vdes nĂ€stan inget av mig (bara stĂ€lla in en konfigurationsparameter. max_parallel_workers).

HÄller du med om att det Àr bekvÀmt nÀr applikationerna fungerar bÀttre direkt efter uppgraderingen? Och vi strÀvar verkligen efter att glÀdja vÄra anvÀndare, för PostgreSQL fÄr fler och fler anvÀndare.

Och hur kommer en enkel uppgradering till PostgreSQL 12 att göra dig lycklig? LÄt mig förklara.

Betydande förbÀttringar av indexering

Utan indexering kommer databasen inte lÄngt. Hur annars kan man snabbt hitta information? Det grundlÀggande indexeringssystemet i PostgreSQL kallas B-trÀd. Denna typ av index Àr optimerad för lagringssystem.

Vi anvÀnder helt enkelt kommandot CREATE INDEX ON some_table (some_column), och PostgreSQL gör det tunga arbetet att hÄlla indexet aktuellt medan vi stÀndigt sÀtter in, uppdaterar och tar bort vÀrden. Allt fungerar automatiskt, som av magi.

Men indexen i PostgreSQL har ett problem — de vĂ€xer. och tar upp onödig plats pĂ„ disken, medan prestandan för datainhĂ€mtning och uppdatering minskar. Med "uppsvĂ€llning" menar jag ineffektiv hantering av indexstrukturen. Detta kan ha – eller inte ha – att göra med skrĂ€pkartor som tas bort VACUUM (tack för informationen Peter Geoghegan (Peter Geoghegan)). UppsvĂ€llning av index Ă€r sĂ€rskilt mĂ€rkbar i arbetsbelastningar dĂ€r indexet aktivt Ă€ndras.

PostgreSQL 12 förbÀttrar vÀsentligt hanteringen av B-trÀd-index, och experiment med tester som TPC-C har visat att utrymmet nu anvÀnds i genomsnitt 40% mindre. Nu spenderar vi mindre tid inte bara pÄ att underhÄlla B-trÀd-index (det vill sÀga skrivoperationer), utan Àven pÄ datainhÀmtning, eftersom indexen har blivit mycket mindre.

Applikationer som aktivt uppdaterar sina tabeller – vanligtvis OLTP-applikationer (behandling av transaktioner i realtid) – kommer att anvĂ€nda disken mycket mer effektivt och hantera förfrĂ„gningar. Ju mer utrymme som finns pĂ„ disken, desto mer utrymme har databasen för att vĂ€xa utan att uppgradera infrastrukturen.

Vissa uppgraderingsstrategier krÀver att B-trÀd-indexen byggs om för att dra nytta av dessa fördelar (till exempel, pg_upgrade bygger inte om index automatiskt). I tidigare versioner av PostgreSQL ledde ombyggnation av stora index i tabeller till betydande stillestÄnd, eftersom inga Àndringar kunde göras under den tiden. Men i PostgreSQL 12 finns det en annan fantastisk funktion: nu kan man bygga om index parallellt med kommandot REINDEX CONCURRENTLY, för att helt undvika stillestÄnd.

I PostgreSQL 12 finns det ocksÄ andra förbÀttringar av indexeringsinfrastrukturen. En annan sak dÀr det inte saknas magi Àr journal med förhandsinspelning, Àven kallad WAL (write-ahead log). Loggen för förhandspostning registrerar varje transaktion i PostgreSQL för eventuella krasch- och replikationsfall. Applikationer anvÀnder den för arkivering och ÄterstÀllning vid en viss tidpunkt. SjÀlvklart skrivs loggen för förhandspostning till disken, vilket kan pÄverka prestandan.

I PostgreSQL 12 minskade kostnaderna för WAL-poster som skapas av GiST-, GIN- och SP-GiST-index vid indexbyggande. Detta ger flera mÀrkbara fördelar: WAL-posterna tar mindre plats pÄ disken och data ÄterstÀlls snabbare, till exempel under en ÄterstÀllning efter krasch eller en tidsÄterstÀllning. Om du anvÀnder sÄdana index i dina applikationer (till exempel, geospatiala applikationer som anvÀnder PostGIS anvÀnder mycket GiST-index), Àr det ytterligare en funktion som kommer att förbÀttra din verksamhet avsevÀrt utan nÄgra anstrÀngningar frÄn din sida.

Partitionering - mer, bÀttre, snabbare

I PostgreSQL 10 introducerades deklara partitionering. I PostgreSQL 11 blev det mycket enklare att anvÀnda. I PostgreSQL 12 kan du Àndra skalningen av partitioner.

I PostgreSQL 12 blev prestandan för partitionssystemet betydligt bÀttre, sÀrskilt om det finns tusentals partitioner i tabellen. Till exempel, om en frÄga berör bara nÄgra fÄ partitioner i en tabell med tusentals, kommer den att köras mycket snabbare. Prestandan har förbÀttrats inte bara för sÄdana typer av frÄgor. Du kommer ocksÄ att mÀrka hur INSERT-operationer i tabeller med mÄnga partitioner har blivit snabbare.

Att skriva data med COPY — för övrigt, det Ă€r ett utmĂ€rkt sĂ€tt för massöverföring av data och hĂ€r Ă€r ett exempel pĂ„ JSON — i partitionerade tabeller i PostgreSQL 12 blev det ocksĂ„ mer effektivt. Med COPY var det snabbt redan, och i PostgreSQL 12 gĂ„r det verkligen snabbt.

Tack vare dessa fördelar kan PostgreSQL lagra Ànnu större datamÀngder, och det har blivit enklare att hÀmta dem. Och inga anstrÀngningar frÄn din sida. Om din applikation har mÄnga partitioner, till exempel, om den skriver tidsseriedata, kommer en enkel uppgradering vÀsentligt att förbÀttra dess prestanda.

Och Àven om denna förbÀttring inte riktigt hör till kategorin 'uppgraderade och jublar', kan du i PostgreSQL 12 skapa frÀmmande nycklar som refererar till partitionerade tabeller, vilket gör att arbete med partitionering blir en ren njutning.

WITH-frÄgor har blivit mycket bÀttre

NÀr en patch för inbyggda generiska tabelluttryck har tillÀmpats (Àven kÀnda som CTE, Àven kÀnda som WITH-frÄgor), jag har lÀnge velat skriva en artikel om hur glada utvecklarna av applikationer Àr med PostgreSQL . Det hÀr Àr en av de funktioner som kommer att snabba upp applikationen. Om du anvÀnder CTE, förstÄs..

Jag mÀrker ofta att nybörjare i SQL gillar att anvÀnda CTE: om man skriver dem pÄ ett visst sÀtt kÀnns det som att man skriver ett imperativt program. Personligen gillade jag att skriva om dessa frÄgor för att klara mig utan CTE och öka prestandan. Nu Àr allt annorlunda.

PostgreSQL 12 tillĂ„ter inbĂ€ddning av en viss typ av CTE utan bieffekter (VÄLJ), som endast anvĂ€nds en gĂ„ng mot slutet av frĂ„gan. Om jag skulle hĂ„lla statistik över frĂ„gor med CTE som jag skrev om, skulle de flesta av dem hamna i den kategorin. Detta hjĂ€lper utvecklare att skriva tydlig kod som nu ocksĂ„ fungerar snabbt.

Dessutom optimerar PostgreSQL 12 SQL-exekveringen sjÀlv, du behöver inte göra nÄgot. Och Àven om jag nu förmodligen inte behöver optimera sÄdana frÄgor, Àr det bra att PostgreSQL fortsÀtter att arbeta med optimeringarna.

Just-in-Time (JIT) – Ă€r nu som standard

I PostgreSQL 12-system med stöd för LLVM JIT-kompilering Àr aktiverad som standard. Först och frÀmst fÄr du stöd för JIT för vissa interna operationer, och för det andra kan frÄgor med uttryck (det enklaste exemplet Àr x + y) i vallistor (som kommer efter SELECT), aggregat, uttryck med WHERE-klausuler och mer anvÀnda JIT för att öka prestandan.

Eftersom JIT Àr aktiverat som standard i PostgreSQL 12, förbÀttras prestandan automatiskt, men jag rekommenderar att testa applikationen i PostgreSQL 11, dÀr JIT just introducerades, för att mÀta prestandan hos frÄgorna och se om nÄgot behöver justeras.

Men vad sÀgs om de andra nya funktionerna i PostgreSQL 12?

I PostgreSQL 12 finns det massor av nya hĂ€ftiga funktioner – frĂ„n möjligheten att utforska JSON-data med hjĂ€lp av standard SQL/JSON-vĂ€gar till multifaktorautentisering med parameter clientcert=verify-full, genererade kolumner och mycket mer. Det rĂ€cker för ett eget inlĂ€gg.

Precis som PostgreSQL 10 kommer PostgreSQL 12 att öka den övergripande prestandan direkt efter uppgraderingen. Du kan sĂ„klart ha din egen vĂ€g – testa applikationen under liknande förhĂ„llanden i produktionssystemet innan du aktiverar förbĂ€ttringarna, som jag gjorde med PostgreSQL 10. Även om PostgreSQL 12 redan nu Ă€r stabilare Ă€n jag hade förvĂ€ntat mig, tveka inte att kvalitets testa applikationer innan du slĂ€pper dem i produktion.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster