Inovácia pre lenivých: ako PostgreSQL 12 zlepšuje výkon

Inovácia pre lenivých: ako PostgreSQL 12 zlepšuje výkon

PostgreSQL 12, najnovšia verzia „najlepšej relačnej databázy s otvoreným zdrojom na svete“ vyjde o pár týždňov (ak všetko pôjde podľa plánu). Toto sa riadi obvyklým harmonogramom vydávania novej verzie s množstvom nových funkcií raz ročne a úprimne povedané, je to pôsobivé. Preto som sa stal aktívnym členom komunity PostgreSQL.

Podľa môjho názoru, na rozdiel od predchádzajúcich vydaní, PostgreSQL 12 neobsahuje jednu alebo dve revolučné funkcie (ako rozdelenie alebo paralelizmus dotazov). Raz som žartoval, že hlavnou vlastnosťou PostgreSQL 12 je väčšia stabilita. Nie je to to, čo potrebujete pri správe kritických údajov vašej firmy?

Ale PostgreSQL 12 nekončí: s novými funkciami a vylepšeniami budú aplikácie fungovať lepšie, a všetko, čo musíte urobiť, je inovovať!

(No, možno prestavte indexy, ale v tomto vydaní to nie je také strašidelné, ako sme zvyknutí.)

Bude skvelé upgradovať PostgreSQL a okamžite si užívať výrazné vylepšenia bez zbytočného rozruchu. Pred pár rokmi som si prezrel upgrade z PostgreSQL 9.4 na PostgreSQL 10 a videl som, ako sa aplikácia zrýchlila vďaka vylepšenému paralelizmu dotazov v PostgreSQL 10. A hlavne sa odo mňa takmer nič nevyžadovalo (stačí nastaviť konfiguračný parameter max_parallel_workers).

Súhlasíte, je to výhodné, keď aplikácie fungujú lepšie ihneď po inovácii. A veľmi sa snažíme vyhovieť používateľom, pretože PostgreSQL ich má stále viac.

Ako vás teda môže uspokojiť jednoduchý upgrade na PostgreSQL 12? teraz ti to poviem.

Hlavné vylepšenia indexovania

Bez indexovania databáza ďaleko nezájde. Ako inak môžete rýchlo nájsť informácie? Základný indexovací systém PostgreSQL je tzv B-strom. Tento typ indexu je optimalizovaný pre úložné systémy.

Jednoducho používame operátora CREATE INDEX ON some_table (some_column)a PostgreSQL robí veľa práce, aby bol index aktuálny, zatiaľ čo neustále vkladáme, aktualizujeme a odstraňujeme hodnoty. Všetko funguje samo od seba, akoby mávnutím čarovného prútika.

Ale PostgreSQL indexy majú jeden problém – oni sú nafúknuté a zaberajú extra miesto na disku a znižujú výkon pri získavaní a aktualizácii údajov. „Nadúvaním“ myslím neefektívne udržiavanie štruktúry indexu. To môže – ale nemusí – súvisieť s odpadkovými n-ticemi, ktoré odstraňuje VACUUM (za informácie ďakujem Petrovi Gaghanovi)Peter Geoghegan)). Nafúknutie indexu je obzvlášť viditeľné pri záťaži, kde sa index aktívne mení.

PostgreSQL 12 výrazne zlepšuje výkon indexov B-stromu a experimenty s benchmarkmi, ako je TPC-C, ukázali, že sa teraz používa v priemere o 40 % menej miesta. Teraz trávime menej času nielen udržiavaním indexov B-stromu (teda operáciami zápisu), ale aj získavaním údajov, pretože indexy sú oveľa menšie.

Aplikácie, ktoré aktívne aktualizujú svoje tabuľky – zvyčajne aplikácie OLTP (spracovanie transakcií v reálnom čase) - bude využívať disk a spracovávať požiadavky oveľa efektívnejšie. Čím viac miesta na disku, tým viac miesta musí databáza narásť bez aktualizácie infraštruktúry.

Niektoré stratégie inovácie vyžadujú prebudovanie indexov B-stromu, aby sa využili tieto výhody (napr. pg_upgrade nebude automaticky prestavovať indexy). V predchádzajúcich verziách PostgreSQL malo prebudovanie veľkých indexov na tabuľkách za následok značné prestoje, pretože medzitým nebolo možné vykonať zmeny. Ale PostgreSQL 12 má ďalšiu skvelú funkciu: teraz môžete prebudovať indexy paralelne s príkazom REINDEXUJTE SÚČASNEaby ste sa úplne vyhli prestojom.

Existujú ďalšie vylepšenia infraštruktúry indexovania v PostgreSQL 12. Ďalšia vec, kde bola nejaká mágia - zápis vopred, známy ako WAL (zápis dopredu). Záznam vopred zaznamenáva každú transakciu v PostgreSQL v prípade zlyhania a replikácie. Aplikácie ho využívajú na archiváciu a bodové zotavenie. Samozrejme, protokol zapisovania dopredu sa zapisuje na disk, čo môže ovplyvniť výkon.

PostgreSQL 12 znížil réžiu záznamov WAL, ktoré vytvárajú indexy GiST, GIN a SP-GiST počas vytvárania indexu. To poskytuje niekoľko hmatateľných výhod: záznamy WAL zaberajú menej miesta na disku a údaje sa prehrávajú rýchlejšie, napríklad počas obnovy po havárii alebo obnovy v určitom čase. Ak takéto indexy používate vo svojich aplikáciách (napríklad geopriestorové aplikácie založené na PostGIS často používajú index GiST), je to ďalšia funkcia, ktorá výrazne zlepší zážitok bez akéhokoľvek úsilia z vašej strany.

Delenie - väčšie, lepšie, rýchlejšie

Bol predstavený PostgreSQL 10 deklaratívne rozdelenie. V PostgreSQL 11 je jeho používanie oveľa jednoduchšie. V PostgreSQL 12 môžete zmeniť mierku sekcií.

V PostgreSQL 12 sa výkon deliaceho systému výrazne zlepšil, najmä ak sú v tabuľke tisíce oddielov. Ak napríklad dotaz ovplyvní iba niekoľko oddielov v tabuľke s tisíckami z nich, vykoná sa oveľa rýchlejšie. Výkon sa nezlepšuje len pre tieto typy dopytov. Tiež si všimnete, aké rýchlejšie sú operácie INSERT na tabuľkách s viacerými oddielmi.

Zaznamenávanie údajov pomocou COPY - mimochodom, toto je skvelý spôsob hromadné sťahovanie dát a tu je príklad prijímanie JSON — rozdelené tabuľky v PostgreSQL 12 sa tiež zefektívnili. S COPY už bolo všetko rýchle, ale v PostgreSQL 12 to úplne letí.

Vďaka týmto výhodám vám PostgreSQL umožňuje ukladať ešte väčšie súbory údajov a zjednodušiť ich načítanie. A žiadne úsilie z vašej strany. Ak má aplikácia veľa oddielov, napríklad zaznamenávanie údajov časových radov, jednoduchý upgrade výrazne zlepší jej výkon.

Aj keď to nie je presne vylepšenie „upgradujte a užívajte si“, PostgreSQL 12 vám umožňuje vytvárať cudzie kľúče, ktoré odkazujú na rozdelené tabuľky, vďaka čomu je práca s partíciou potešením.

WITH dopytov je teraz oveľa lepšie

Kedy bola aplikovaná oprava pre vstavané bežné tabuľkové výrazy (aka CTE, aka WITH queries), nemohol som sa dočkať, kedy o tom napíšem článok ako boli vývojári aplikácií s PostgreSQL spokojní. Toto je jedna z funkcií, ktorá urýchli aplikáciu. Pokiaľ, samozrejme, nepoužívate CTE.

Často zisťujem, že začiatočníci v SQL radi používajú CTE; ak ich napíšete určitým spôsobom, naozaj to vyzerá, ako keby ste písali nevyhnutný program. Osobne sa mi páčilo prepisovať tieto otázky, aby som to obišiel bez CTE a zvýšiť produktivitu. Teraz je všetko inak.

PostgreSQL 12 vám umožňuje vložiť konkrétny typ CTE bez vedľajších účinkov (SELECT), ktorý sa použije iba raz na konci požiadavky. Ak by som sledoval CTE dopyty, ktoré som prepísal, väčšina z nich by spadala do tejto kategórie. To pomáha vývojárom písať jasný kód, ktorý teraz tiež beží rýchlo.

PostgreSQL 12 navyše optimalizuje samotné vykonávanie SQL bez toho, aby ste museli čokoľvek robiť. A hoci teraz asi nebudem potrebovať optimalizovať takéto dotazy, je skvelé, že PostgreSQL naďalej pracuje na optimalizácii dotazov.

Just-in-Time (JIT) – teraz predvolené

Na systémoch PostgreSQL 12 s podporou Llvm Kompilácia JIT je predvolene povolená. V prvom rade získate podporu JIT pre niektoré interné operácie a po druhé, dotazy s výrazmi (najjednoduchší príklad je x + y) vo výberových zoznamoch (ktoré máte po SELECT), agregáty, výrazy s klauzulami WHERE a iné môžu použiť JIT na zlepšenie výkonu.

Keďže JIT je štandardne povolený v PostgreSQL 12, výkon sa zlepší sám o sebe, ale odporúčam otestovať aplikáciu v PostgreSQL 11, ktorá zaviedla JIT, aby ste zmerali výkon dotazov a zistili, či nepotrebujete niečo vyladiť.

A čo ostatné nové funkcie v PostgreSQL 12?

PostgreSQL 12 má množstvo skvelých nových funkcií, od schopnosti skúmať údaje JSON pomocou štandardných výrazov smerovania SQL/JSON až po viacfaktorovú autentifikáciu s parametrom. clientcert=verify-full, vytvorené stĺpce a mnoho ďalšieho. Dosť na samostatný príspevok.

Rovnako ako PostgreSQL 10, PostgreSQL 12 zlepší celkový výkon ihneď po inovácii. Samozrejme, môžete mať svoju vlastnú cestu - otestujte aplikáciu za podobných podmienok na produkčnom systéme pred povolením vylepšení, ako som to urobil s PostgreSQL 10. Aj keď je PostgreSQL 12 už stabilnejší, ako som očakával, nebuďte leniví v testovaní aplikácie dôkladne pred uvedením do výroby.

Zdroj: hab.com

Pridať komentár