Antipatterns PostgreSQL: a’ sabaid an aghaidh tagaichean nam “marbh”

Tha feartan sònraichte innealan PostgreSQL a-staigh a’ leigeil leis a bhith gu math luath ann an cuid de shuidheachaidhean agus “chan eil gu math luath” ann an cuid eile. An-diugh cuiridh sinn fòcas air eisimpleir clasaigeach de chòmhstri eadar mar a tha DBMS ag obair agus na bhios an leasaiche a’ dèanamh leis - ÙRACHADH vs prionnsapalan MVCC.

Sgeulachd ghoirid bho artaigil sgoinneil:

Nuair a thèid sreath atharrachadh le àithne ÙRACHADH, thèid dà ghnìomhachd a choileanadh: DELETE agus INSERT. ANNS tionndadh làithreach den t-sreath Tha xmax air a shuidheachadh co-ionann ris an àireamh de ghnìomhachd a rinn an ÙRACHADH. An uairsin tha e air a chruthachadh dreach ùr an aon loidhne; tha a luach xmin aig an aon àm ri luach xmax an tionndaidh roimhe.

Beagan ùine às deidh a ’ghnothach seo a chrìochnachadh, bidh an dreach sean no ùr, a rèir COMMIT/ROOLBACK, aithnichear e "marbh" (tuples marbh) nuair a thèid seachad VACUUM a rèir a' bhùird agus air fhuadachadh.

Antipatterns PostgreSQL: a’ sabaid an aghaidh tagaichean nam “marbh”

Ach cha tachair seo anns a 'bhad, ach gheibhear duilgheadasan le "marbh" gu math luath - le ath-aithris no ùrachadh mòr air clàran ann an clàr mòr, agus beagan an dèidh sin thig thu tarsainn air an aon suidheachadh Cha bhith VACUUM comasach air do chuideachadh.

#1: Is toil leam a ghluasad

Canaidh sinn gu bheil an dòigh agad ag obair air loidsig gnìomhachais, agus gu h-obann tha e a’ tuigsinn gum biodh e riatanach an raon X ùrachadh ann an cuid de chlàr:

UPDATE tbl SET X = <newX> WHERE pk = $1;

An uairsin, mar a thèid an cur gu bàs, tha e coltach gum bu chòir an raon Y ùrachadh cuideachd:

UPDATE tbl SET Y = <newY> WHERE pk = $1;

... agus an uairsin cuideachd Z - carson a tha thu a’ caitheamh ùine air trifles?

UPDATE tbl SET Z = <newZ> WHERE pk = $1;

Cia mheud dreach den chlàr seo a tha againn a-nis san stòr-dàta? Tha, 4 pìosan! Dhiubh sin, tha aon dhiubh buntainneach, agus feumaidh 3 a bhith air an glanadh às do dhèidh le [auto]VACUUM.

Na dèan mar seo! Cleachd ag ùrachadh a h-uile raon ann an aon iarrtas - cha mhòr an-còmhnaidh faodar loidsig an dòigh atharrachadh mar seo:

UPDATE tbl SET X = <newX>, Y = <newY>, Z = <newZ> WHERE pk = $1;

#2: Cleachd IS FIOSRACHADH BHO, Lucas!

Mar sin, bha thu fhathast ag iarraidh ùraich mòran, mòran chlàran ann an clàr (nuair a thathar a’ cleachdadh sgriobt no inneal-tionndaidh, mar eisimpleir). Agus tha rudeigin mar seo ag itealaich a-steach don sgriobt:

UPDATE tbl SET X = <newX> WHERE pk BETWEEN $1 AND $2;

Bidh iarrtas timcheall air an fhoirm seo a’ tachairt gu math tric agus cha mhòr an-còmhnaidh gun a bhith a’ lìonadh raon falamh ùr, ach airson cuid de mhearachdan san dàta a cheartachadh. Aig an aon àm, tha i fhèin chan eilear a’ toirt aire do cheartachd an dàta a th’ ann mar-thà - ach gu dìomhain! Is e sin, tha an clàr air ath-sgrìobhadh, eadhon ged a bha e a’ toirt a-steach dìreach na bhathas ag iarraidh - ach carson? Feuch an cuir sinn ceart e:

UPDATE tbl SET X = <newX> WHERE pk BETWEEN $1 AND $2 AND X IS DISTINCT FROM <newX>;

Tha mòran dhaoine nach eil mothachail gu bheil gnìomhaiche cho iongantach ann, agus mar sin seo duilleag meallta air IS DISTINCT FROM agus gnìomhaichean loidsigeach eile gus cuideachadh:
Antipatterns PostgreSQL: a’ sabaid an aghaidh tagaichean nam “marbh”
... agus beagan mu obrachaidhean air iom-fhillte ROW()-abairtean:
Antipatterns PostgreSQL: a’ sabaid an aghaidh tagaichean nam “marbh”

#3: Tha mi ag aithneachadh mo leannan le... a' bacadh

gan cur air bhog dà phròiseas co-shìnte co-ionann, agus bidh gach fear dhiubh a’ feuchainn ris an inntrig gu bheil e “a’ dol air adhart” a chomharrachadh:

UPDATE tbl SET processing = TRUE WHERE pk = $1;

Eadhon ged a nì na pròiseasan sin rudan gu neo-eisimeileach bho chèile, ach taobh a-staigh an aon ID, bidh an dàrna neach-dèiligidh “glaiste” air an iarrtas seo gus an tèid a’ chiad ghnothach a chrìochnachadh.

Fuasgladh #1: tha an obair air a lùghdachadh chun an fhear roimhe

Nach cuir sinn dìreach e a-rithist IS DISTINCT FROM:

UPDATE tbl SET processing = TRUE WHERE pk = $1 AND processing IS DISTINCT FROM TRUE;

Anns an fhoirm seo, chan atharraich an dàrna iarrtas dad sam bith san stòr-dàta, tha a h-uile dad mar a bu chòir a bhith - mar sin, cha tachair bacadh. An uairsin, bidh sinn a’ pròiseasadh fìrinn “gun a bhith a’ lorg ”clàr san algairim gnìomhaichte.

Fuasgladh #2: glasan comhairleach

Cuspair mòr airson artaigil air leth, anns am faod thu leughadh mu dheidhinn dòighean tagraidh agus “rake” de bhacadh molaidhean.

Fuasgladh #3: glaodhan gòrach

Ach is e seo dìreach a bu chòir tachairt dhut obair aig an aon àm leis an aon chlàr? No an do rinn thu bùrach leis na h-algorithms airson a bhith a’ gairm loidsig gnìomhachais air taobh teachdaiche, mar eisimpleir? Agus ma smaoinicheas tu mu dheidhinn? ...

Source: www.habr.com

Cuir beachd ann