Ji bo tembelan nûvekirin: PostgreSQL 12 çawa performansê baştir dike

Ji bo tembelan nûvekirin: PostgreSQL 12 çawa performansê baştir dike

PostgreSQL 12, serbestberdana herî dawî ya "baştirîn databasa pêwendiya çavkaniya vekirî ya cîhanê", di nav du hefteyan de derdikeve (heke her tişt li gorî planê biçe). Ev li dû bernameya asayî ye - guhertoyek nû bi gelek taybetmendiyên nû salê carekê derdikeve, û, bi eşkere, ew bi heybet e. Ji ber vê yekê ez bûm endamek çalak ê civata PostgreSQL.

Bi dîtina min, berevajî weşanên paşîn, PostgreSQL 12 yek an du taybetmendiyên şoreşgerî nagire (wekî dabeşkirin an paralelîzma pirsê). Min carekê henek kir ku taybetmendiya sereke ya PostgreSQL 12 aramiya mezintir e. Dema ku hûn daneyên krîtîk ên karsaziya xwe birêve dibin ne ew e ku hûn hewce ne?

Lê PostgreSQL 12 bi vê yekê re ne sînorkirî ye: bi taybetmendî û pêşkeftinên nû, serîlêdan dê çêtir bixebitin, Ya ku hûn hewce ne bikin ev e ku hûn nûve bikin!

(Belê, belkî jî navnîşan ji nû ve ava bikin, lê di vê berdanê de ew ne ew qas tirsnak e ku em bikar tînin.)

Dê pir baş be ku PostgreSQL nûve bikin û tavilê bêyî tevgerên nehewce ji pêşkeftinên girîng sûd werbigirin. Çend sal berê, min nûvekirina ji PostgreSQL 9.4 berbi PostgreSQL 10 vekolîn kir û dît ku sepan çiqas zûtir bû ji ber paralelbûna pirsê ya di PostgreSQL 10-ê de çêtir bû. Û, ya herî girîng, hema hema tiştek ji min ne hewce bû (tenê pîvana veavakirinê saz bikin max_parallel_workers).

Bipejirînin, dema ku serîlêdan tavilê piştî nûvekirinê çêtir dixebitin rehet e. Û em pir hewl didin ku bikarhêneran xweş bikin, ji ber ku PostgreSQL bêtir û bêtir ji wan hene.

Û nûvekirinek hêsan a PostgreSQL 12 çawa we kêfxweş dike? Niha ezê ji te re bibêjim.

Pêşveçûnên sereke yên indekskirinê

Bê îndekskirin, databas dê dûr neçe. Wekî din hûn çawa dikarin zû agahdarî bibînin? Pergala navnîşkirina bingehîn ya PostgreSQL tê gotin B-dara. Ev celeb index ji bo pergalên hilanînê xweşbîn e.

Em tenê operatorê bikar tînin CREATE INDEX ON some_table (some_column), û PostgreSQL di dema ku em bi domdarî nirxan têxin, nûvekirin û jêbirina îndeksê rojane dike, karekî hêja dike. Her tişt bi serê xwe dixebite, mîna sêrbaziyê.

Lê navnîşên PostgreSQL yek pirsgirêk hene - ew nepixî û cîhê dîskê zêde digire, û performansa derxistin û nûvekirina daneyan kêm dibe. Bi "bloat" ez mebesta min lênihêrîna bêserûber a strukturê indexê ye. Dibe ku ev yek bi çîpên çopê re têkildar be an nebe VACUUM (spas ji Peter Gagan re ji bo agahdariyê)Peter Geoghegan)). Bûbûna îndeksê bi taybetî di barkêşên xebatê de ku îndeks bi rengek çalak diguhere de diyar dibe.

PostgreSQL 12 performansa nîşaneyên dara B-yê pir çêtir dike, û ceribandinên bi ceribandinên mîna TPC-C destnîşan kirin ku cîh naha, bi navînî, 40% kêmtir tê bikar anîn. Naha em ne tenê ji bo domandina nîşaneyên dara B-yê (ango, operasyonên nivîsandinê) kêmtir wext derbas dikin, lê di heman demê de daneyan jî vedigirin, ji ber ku index pir piçûktir bûne.

Serlêdanên ku bi çalak tabloyên xwe nûve dikin bi gelemperî serîlêdanên OLTP ne (pêvajoya danûstendinê ya rast-ê) dê di warê karanîna dîskê û pêvajoya lêpirsînê de pir bikêrtir be. Cihê dîskê bêtir, ew qas jûreyek heye ku databas bêyî nûvekirinên binesaziyê mezin bibe.

Hin stratejiyên nûvekirinê ji we re hewce dike ku hûn navnîşên B-dara ji nû ve ava bikin da ku ji van feydeyan sûd werbigirin (mînak, pg_upgrade dê indexan bixweber ji nû ve ava neke). Di guhertoyên berê yên PostgreSQL de, ji nû ve avakirina îndeksên mezin li ser tabloyan bû sedema paşveçûnek girîng ji ber ku di wê demê de tu guhertin çênebû. Lê PostgreSQL 12 xwedan taybetmendiyek din a xweş e: naha hûn dikarin bi fermanê re paralel indexan ji nû ve ava bikin REINDEX HEVKARÎda ku bi tevahî ji demdirêjiyê dûr bixin.

PostgreSQL 12 di binesaziya nîşankirinê de çêtirkirinên din hene. Tiştek din ku li wir çend sêrbaz hebû - têketina pêş-nivîsandinê, an jî WAL (têketin-pêş-nivîsandinê). Têketina pêş-nivîsandinê her danûstendinê ji PostgreSQL re di rewşek têkçûn û dubarekirinê de dinivîse. Serlêdan wê ji bo arşîvkirin û xala-li-time başbûneke. Bê guman, têketina pêş-nivîsandinê li ser dîskê tê nivîsandin, û ev dikare bandorê li performansê bike.

PostgreSQL 12 serkêşiya tomarên WAL-ê yên ku ji hêla GiST, GIN, û SP-GiST ve têne çêkirin dema ku indexek tê çêkirin kêm kir. Vê yekê çend feydeyên berbiçav hene: tomarên WAL kêmtir cîhê dîskê digire, û dane zûtir têne dubare kirin, wek mînak di dema têkçûn an nûvekirina xala-di-dem de. Ger hûn di serîlêdanên xwe de indexên weha bikar bînin (mînak, serîlêdanên erdnîgarî-based PostGIS pir indeksa GiST bikar tînin), ev taybetmendiyek din e ku dê bêyî hewildanek ji hêla we ve performansê pir çêtir bike.

Parvekirin - Mezintir, Baştir, Zûtir

PostgreSQL 10 destnîşan kir dabeşkirina ragihandinê. Di PostgreSQL 11 de, karanîna wê pir hêsantir bûye. Di PostgreSQL 12 de, hûn dikarin dabeşan pîvan bikin.

Di PostgreSQL 12 de, performansa pergala dabeşkirinê pir çêtir bûye, nemaze heke di tabloyek bi hezaran partîsîyon de hebin. Mînakî, heke pirsek di tabloyek bi hezaran ji wan de tenê çend dabeşan bandor bike, ew ê pir zûtir bixebite. Pêşveçûnên performansê bi van cûreyên pirsan re ne sînorkirî ne. Her weha hûn ê bala xwe bidin ku operasyonên INSERT li ser tabloyên bi gelek dabeşan çiqas zûtir in.

Daneyên nivîsandinê bi kar tînin KOPÎ - Bi awayê, ev rêyek mezin e barkirina daneya mezin û li vir mînakek e wergirtina JSON - tabloyên dabeşkirî yên di PostgreSQL 12 de jî bikêrtir bûye. Bi COPY re her tişt zû bû, lê di PostgreSQL 12 de ew bi tevahî difire.

Van feydeyan ji PostgreSQL re gengaz dike ku daneyên hêj mezintir hilîne û hilanîna wan hêsantir dike. Û tu hewldanên ji aliyê we. Ger serîlêdan gelek beşan hebe, mînakî, ew daneyên rêzikên demê dinivîse, nûvekirinek hêsan dê performansa wê bi girîngî baştir bike.

Û her çend ev bi rastî ne çêtirbûnek nûvekirin-û-şadbûnê ye, di PostgreSQL 12 de hûn dikarin bişkokên biyanî yên ku li tabloyên dabeşkirî vedibêjin biafirînin da ku xebata bi dabeşkirinê re xweş bikin.

BI pirsan tenê pir çêtir bû

Dema ku patchek ji bo biwêjên tabloya hevpar a hundurîn hatî sepandin (aka CTE, ango WITH queries), ez dişewitim ku ez gotarek li ser çawa binivîsim Pêşdebirên serîlêdanê çiqas bi PostgreSQL kêfxweş bûn. Ev yek ji wan taybetmendiyan e ku dê serîlêdanê bilez bike. Heya ku, bê guman, hûn CTE bikar bînin.

Ez pir caran bala xwe didim ku destpêkên SQL ji karanîna CTE hez dikin: heke hûn wan bi rengek diyar binivîsin, hûn hîs dikin ku hûn bernameyek mecbûrî dinivîsin. Bi kesane, min hez kir ku ez van pirsan ji nû ve binivîsim da ku li dora xwe bigerim bêyî CTE û hilberînê zêde bikin. Niha her tişt cuda ye.

PostgreSQL 12 destûrê dide te ku hûn celebek CTE-ya taybetî bêyî bandorên alî binivîsin (SELECT), ku tenê carekê nêzîkî dawiya daxwaznameyê tê bikar anîn. Ger min pirsên CTE-ê yên ku min ji nû ve nivîsandin bişopînim, piraniya wan dê di vê kategoriyê de bikevin. Ev ji pêşdebiran re dibe alîkar ku kodek zelal binivîsin ku naha jî bilez e.

Wekî din, PostgreSQL 12 pêkanîna SQL bixwe xweşbîn dike, hûn ne hewce ne ku tiştek bikin. Digel ku ez ê ne hewce be ku naha pirsên weha xweşbîn bikim, pir xweş e ku PostgreSQL li ser xweşbînkirina pirsê xebata xwe didomîne.

Just-in-Time (JIT) - naha xwerû

Li ser pergalên PostgreSQL 12 bi piştgirî LLVM Berhevkirina JIT ji hêla xwerû ve çalak e. Pêşîn, hûn piştgirî bistînin JIT ji bo hin operasyonên navxweyî, û ya duyemîn, pirsên bi îfadeyan (nimûneya herî hêsan x + y ye) di navnîşên hilbijartî de (yên ku hûn piştî SELECT hene), berhevok, biwêjên bi bendên WHERE, û yên din dikarin JIT bikar bînin da ku performansê baştir bikin.

Ji ber ku JIT di PostgreSQL 12-ê de ji hêla xwerû ve hatî çalak kirin, performans dê bixwe baştir bibe, lê ez pêşniyar dikim ku serîlêdanê di PostgreSQL 11 de, ku JIT yekem car hate destnîşan kirin, ceribandine, da ku performansa pirsê bipîve û binihêre gelo tiştek pêdivî bi tweakirinê heye.

Lê li ser taybetmendiyên mayî yên nû yên PostgreSQL 12 çi ye?

PostgreSQL 12 xwedan ton taybetmendiyên nû yên xweş e, ji şiyana teftîşkirina daneyên JSON-ê bi karanîna vegotinên rêça standard ên SQL/JSON bigire heya rastrastkirina pir-faktorî bi clientcert=verify-full, stûnên çêkirî, û bêtir. Ji bo postek cuda bes e.

Mîna PostgreSQL 10, PostgreSQL 12 dê tavilê piştî nûvekirinê performansa giştî baştir bike. Bê guman, hûn dikarin riya xwe hebin - serîlêdanê di bin şert û mercên wekhev de li ser pergalek hilberînê biceribînin berî ku çêtirkirinan çalak bikin, wek ku min bi PostgreSQL 10 re kir. Her çend PostgreSQL 12 jixwe ji min hêvî dikir aramtir be jî, ji ceribandina sepanan tembel nebin. baş, berî berdana wan di hilberînê de.

Source: www.habr.com

Add a comment