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
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.
Ach cha tachair seo anns a 'bhad, ach gheibhear duilgheadasan le "marbh" gu math luath - le ath-aithris no
#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
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:
... agus beagan mu obrachaidhean air iom-fhillte ROW()
-abairtean:
#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
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