Mugandused laiskadele: kuidas PostgreSQL 12 tÔstab jÔudlust

Mugandused laiskadele: kuidas PostgreSQL 12 tÔstab jÔudlust

PostgreSQL 12, viimane versioon "parimast avatud lĂ€htekoodiga relatsioonilisest andmebaasist maailmas" ilmub paar nĂ€dalat (kui kĂ”ik lĂ€heb plaanipĂ€raselt). See vastab tavapĂ€rasele graafikule — uus versioon, kus on hulgaliselt uusi vĂ”imalusi, ilmub kord aastas, ja ausalt öeldes, see on muljetavaldav. SeetĂ”ttu olen mina ka aktiivne PostgreSQL kogukonna liige.

Minu arvates, erinevalt eelmiste vĂ€ljaannetest, ei sisalda PostgreSQL 12 ĂŒhtegi revolutsioonilist funktsiooni (nagu nĂ€iteks sektsioonimine vĂ”i pĂ€ringute paralleelne töötlemine). Ma naljatasin kunagi, et PostgreSQL 12 peamine eelis on suurem stabiilsus. Kas just seda ei vajata, kui hallatakse teie Ă€ri kriitilisi andmeid?

Aga PostgreSQL 12 ei piirdu sellega: uute vÔimaluste ja tÀiustustega töötavad rakendused paremini, ja teie peate lihtsalt uuendama!

(Noh, vĂ”ib-olla tuleb veel indeksid uuesti ĂŒles ehitada, kuid kĂ€esolevas vĂ€ljalaskes ei ole see nii hirmutav, kui oleme harjunud.)

Oleks, et oleks suurepĂ€rane — uuendada PostgreSQL-i ja nautida kohe mĂ€rkimisvÀÀrseid parandusi ilma liigsete pingutusteta. MĂ”ned aastad tagasi analĂŒĂŒsisin vĂ€rskendust PostgreSQL 9.4 versioonilt PostgreSQL 10-le ning nĂ€gin, kui palju kiirus paraneb tĂ€nu parematele pĂ€ringute paralleelsusele PostgreSQL 10-s. Ja mis kĂ”ige tĂ€htsam, see ei nĂ”udnud minult peaaegu midagi (sain lihtsalt mÀÀrata konfiguratsiooniparametri max_parallel_workers).

Olge nÔus, et on mugav, kui rakendused hakkavad pÀrast vÀrskendamist kohe paremini toimima. Me pingutame tÔeliselt, et kasutajaid rÔÔmustada, sest PostgreSQL-i kasutajad kasvavad jÀrjest rohkem.

Ja kuidas lihtne uuendus PostgreSQL 12-le teid Ă”nnelikuks teeb? Selgitan nĂŒĂŒd.

Olulised edusammud indekseerimises

Ilma indekseerimiseta ei pÀÀse andmebaas kaugele. Kuidas muidu kiiresti teavet leida? PostgreSQL-i pĂ”histatistika sĂŒsteem on B-puu. See indeksitĂŒĂŒp on optimeeritud salvestussĂŒsteemide jaoks.

Kasutame lihtsalt kÀsku CREATE INDEX ON some_table (some_column), ja PostgreSQL teeb suure osa tööst, et indeks oleks ajakohane, kui me pidevalt vÀÀrtusi sisestame, uuendame ja eemaldame. KÔik toimib iseeneslikult, justkui nÔia vÀel.

Entretanto, PostgreSQL indeksid on ĂŒks probleem — need paisuvad ning vĂ”tavad kĂ”vakettal liigset ruumi, mis vĂ€hendab andmete vĂ€ljatoomise ja vĂ€rskendamise jĂ”udlust. „Paisumise” all mĂ”istan ma indeksistruktuuri mitteefektiivset hoidmist. See vĂ”ib olla — vĂ”i ei pruugi — seotud rĂ€mpskandidaatidega, mida eemaldab VACUUM (tĂ€nu Peter Geogheganile (Peter Geoghegan)). Indeksi paisumine on eriti silmatorkav töökoormustes, kus indeks muutub aktiivselt.

PostgreSQL 12 parandab oluliselt B-puu indeksite toimimist ning TPC-C testide eksperimendid on nĂ€idanud, et ruumi kasutatakse nĂŒĂŒd keskmiselt 40% vĂ€hem. Kulutame nĂŒĂŒd vĂ€hem aega mitte ainult B-puu indeksite hooldamiseks (st kirjutamisoperatsioonideks), vaid ka andmete vĂ€ljatoomiseks, kuna indeksid on oluliselt vĂ€iksemad.

Rakendused, mis aktiivselt uuendavad oma tabeleid — tavaliselt OLTP rakendused (reaalajas tehingute töötlemine) — kasutavad ketast palju tĂ”husamalt ja töötlevad pĂ€ringud. Mida rohkem on kettal ruumi, seda rohkem on andmebaasil kasvuruumi ilma infrastruktuuri uuendamata.

MĂ”ned uuendamisstrateegiad vajavad B-puu indeksite ĂŒmberkujundamist, et neid eeliseid maksimaalselt Ă€ra kasutada (nĂ€iteks, pg_upgrade ei ehita indekseid automaatselt). Varasemates PostgreSQL versioonides suurte indeksite ĂŒmbertegemine tabelites pĂ”hjustas suure ĂŒldseisaku, kuna sel ajal ei saanud andmeid muuta. Kuid PostgreSQL 12-l on veel ĂŒks suurepĂ€rane omadus: nĂŒĂŒd saab indekseid ĂŒheaegselt uuendada kĂ€suga REINDEX CONCURRENTLY, et tĂ€ielikult vĂ€ltida seisakut.

PostgreSQL 12-l on ka teisi indekseerimise infrastruktuuri tĂ€iustusi. Veel ĂŒks asi, kus ei saanud ilma vĂ”lujĂ”uta, on eelmise kirje pĂ€evik, tuntud ka kui WAL (write-ahead log). Eelmise kirje pĂ€evik salvestab iga tehingu PostgreSQL-is, et ette valmistada tĂ”rke ja taastumise korral. Rakendused kasutavad seda arhiveerimiseks ja teatud hetke taastamiseks. Loomulikult kirjutatakse eelmise kirje pĂ€evik kettale, mis vĂ”ib mĂ”jutada jĂ”udlust.

PostgreSQL 12-s vĂ€hendati WAL-salvestuste kulu, mida loomise indeksite GiST, GIN ja SP-GiST kĂ€igus tekitatakse. See pakub mitmeid mĂ€rgatavaid eeliseid: WAL-salvestused vĂ”tavad vĂ€hem ketas ruumi ja andmete taastamine toimub kiiremini, nĂ€iteks tĂ”rke taastamise vĂ”i ajaprogrammi taastamise ajal. Kui kasutate neid indekseid oma rakendustes (nĂ€iteks geograafilised rakendused, mis pĂ”hinevad PostGIS-il, kasutavad GiST-indeksit laialdaselt), on see veel ĂŒks funktsioon, mis parandab teie töö efektiivsust ilma lisapingutusteta.

Sektsioonimine — rohkem, parem, kiirem

PostgreSQL 10-s lisandus deklaratiivne sektsioonimine. PostgreSQL 11-s on see palju lihtsam kasutada. PostgreSQL 12-s on vÔimalik sektsioonide skaalat muuta.

PostgreSQL 12-s suutlikkus sektsioonimise osas on oluliselt paranenud, eriti kui tabelis on tuhandeid sektsioone. NÀiteks kui pÀring hÔlmab vaid mÔningaid sektsioone tabelis, kus neid on tuhandeid, tÀidetakse see palju kiiremini. Suutlikkuse parandus ei piirdu ainult selliste pÀringutega. Samuti mÀrkate, kui kiireks on muutunud INSERT operatsioonid tabelites, kus on palju sektsioone.

Andmete salvestamine COPY — muide, see on suurepĂ€rane viis masstestimise jaoks ja siin on nĂ€ide JSON vastuvĂ”tust — sektsioneeritud tabelitesse PostgreSQL 12-s on samuti muutunud tĂ”husamaks. COPY meetodi kasutamine oli juba kiire, kuid PostgreSQL 12-s on see tĂ€iesti uskumatu.

Nende eeliste tÔttu saavad PostgreSQL-s salvestada veelgi suuremaid andmekogumeid, samas kui nende vÀljavÔtmine on muutunud lihtsamaks. Ja te ei pea selle nimel pingutama. Kui teie rakendusel on palju sektsioone, nÀiteks kui see salvestab ajarekke, siis lihtne uuendus parandab selle jÔudlust oluliselt.

Kuigi see tĂ€iendus ei kuulu just kategooriasse â€žĂŒles tĂ”stetud ja rÔÔmustame”, vĂ”imaldab PostgreSQL 12 luua vĂ€listĂ€iendusi, mis viitavad sektsioonitud tabelitele, et sektsioonimisega töötamine oleks tĂ”eline nauding.

WITH pÀringud on saanud palju paremaks.

Kui töötati vĂ€lja tĂ€iendav patch sisseehitatud ĂŒldiste tabelite vĂ€ljendite jaoks (need on CTE-d, need on WITH pĂ€ringud), siis ei saanud ma oodata, et kirjutada artikkel sellest, kui rÔÔmsad olid arendajad koos PostgreSQL-iga. See on ĂŒks neist funktsioonidest, mis kiirendavad rakendust. Kui, muidugi, kasutate CTE-d.

Ma olen sageli mĂ€rganud, et SQL-i algajad armastavad CTE-sid kasutada: kui kirjutada need teatud viisil, tunned, et kirjutad imperatiivset programmi. Isiklikult meeldis mulle need pĂ€ringud ĂŒmber kirjutada, et ilma jÀÀda ilma CTE-dest ja suurendada jĂ”udlust. NĂŒĂŒd on kĂ”ik teisiti.

PostgreSQL 12 vĂ”imaldab mĂ”ningate CTE-de infrastruktuuri ilma kĂ”rvalnĂ€htudeta (SELECT), mida kasutatakse ainult ĂŒks kord pĂ€ringu lĂ”pus. Kui ma jĂ€lgiksin CTE pĂ€ringute statistikat, siis enamik neist kuuluks sellesse kategooriasse. See aitab arendajatel kirjutada arusaadavat koodi, mis nĂŒĂŒd töötab veel kiiremini.

Lisaks sellele optimiseerib PostgreSQL 12 SQL-i teostust automaatselt, teil ei pea midagi tegema. Ja kuigi ilmselt ei pea ma enam selliseid pÀringuid optimeerima, on tore, et PostgreSQL jÀtkab pÀringute optimeerimisega töötamist.

Just-in-Time (JIT) — nĂŒĂŒd vaikimisi

PostgreSQL 12 sĂŒsteemides, mis toetavad LLVM JIT-kompileerimine on vaikimisi lubatud. Esiteks, te saate toe JIT mĂ”nede sisemiste toimingute jaoks ning teiseks, vĂ€ljenditega pĂ€ringud (lihtsaim nĂ€ide — x + y) valikuliste loendites (mis seisavad pĂ€rast SELECT), agregaatides, WHERE-haru vĂ€ljendites ja muudes saavad JIT'i kasutada jĂ”udluse parandamiseks.

Kui JIT on PostgreSQL 12 vaikimisi sisse lĂŒlitatud, paraneb jĂ”udlus iseenesest, kuid soovitan testida rakendust PostgreSQL 11-s, kus JIT alles ilmus, et mÔÔta pĂ€ringute jĂ”udlust ja mÀÀrata, kas midagi vajab seadistamist.

Aga kuidas on teiste uute funktsioonidega PostgreSQL 12?

PostgreSQL 12-s on palju uusi lahedaid funktsioone - alates JSON andmete uurimise vÔimalusest standardsete SQL/JSON teekondade abil kuni mitme faktoriga autentimiseni parameetriga clientcert=verify-full, genereeritud veergude ja paljuga muuga. Selleks on vaja eraldi postitust.

Nagu PostgreSQL 10, tĂ”stab PostgreSQL 12 ka pĂ€rast uuendust ĂŒldist jĂ”udlust. Loomulikult vĂ”ib teil olla oma lĂ€henemine - testige rakendust sarnastes tingimustes tootmissĂŒsteemis, enne kui lĂŒlitate sisse tĂ€iustused, nagu tegin mina PostgreSQL 10-ga. Isegi kui PostgreSQL 12 on juba praegu stabiilsem, kui ma eeldasin, Ă€rge unustage kvalitatiivselt testida rakendusi, enne kui need tootmisse lĂ€hevad.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster