Tha fios farsaing air aâ bhuaidh a thâ aig bloat air bĂšird agus clĂ ran-amais agus tha e an lĂ thair chan ann a-mhĂ in ann am Postgres. Tha dòighean ann dèiligeadh ris a-mach Ă s aâ bhogsa, leithid VACUUM FULL no CLUSTER, ach bidh iad aâ glasadh chlĂ ran fhad âs a tha iad ag obair agus mar sin chan urrainnear an cleachdadh an-còmhnaidh.
Bidh beagan teòiridh anns an artaigil mu mar a tha bloat a âtachairt, mar as urrainn dhut a shabaid, mu chuingealachaidhean dĂ il agus na duilgheadasan a bheir iad gu cleachdadh an leudachadh pg_repack.
Tha an artaigil seo stèidhichte air
Carson a tha bloat a 'tachairt?
Tha Postgres stèidhichte air modal ioma-dreach (
Gu follaiseach, feumar na dreachan sin uile a stòradh. Bidh Postgres ag obair le cuimhne duilleag air duilleag agus is e duilleag an Ïre as lugha de dhà ta a ghabhas leughadh bho dhiosg no sgrÏobhte. Bheir sinn sÚil air eisimpleir bheag gus tuigsinn mar a thachras seo.
Canaidh sinn gu bheil clĂ r againn ris an do chuir sinn grunn chlĂ ran ris. Tha dĂ ta Ăšr air nochdadh air aâ chiad duilleag den fhaidhle far a bheil an clĂ r air a stòradh. Is iad sin dreachan beò de shreathan a tha rim faighinn do ghnothaichean eile Ă s deidh gealltanas (airson sĂŹmplidh, gabhaidh sinn ris gu bheil an ĂŹre aonaranachd Leugh Dealaichte).
An uairsin dhâ Ăšraich sinn aon de na h-inntrigidhean, agus mar sin aâ comharrachadh an t-seann dreach mar nach eil iomchaidh tuilleadh.
Ceum air cheum, ag Ăšrachadh agus aâ cuir Ă s do dhreachan sreath, chrĂŹochnaich sinn le duilleag anns a bheil timcheall air leth den dĂ ta mar âsgudalâ. Chan eil an dĂ ta seo ri fhaicinn do ghnothach sam bith.
Tha uidheamachd aig Postgres
Mar sin nar n-eisimpleir, aig Ă m air choreigin bidh ceithir duilleagan anns aâ chlĂ r, ach cha bhi dĂ ta beò ann ach leth dheth. Mar thoradh air an sin, nuair a gheibh sinn cothrom air aâ chlĂ r, leughaidh sinn tòrr a bharrachd dĂ ta na tha riatanach.
FiĂš ma tha VACUUM a-nis aâ cuir Ă s do gach dreach sreath neo-iomchaidh, cha tig adhartas mòr air an t-suidheachadh. Bidh Ă ite an-asgaidh againn ann an duilleagan no eadhon duilleagan slĂ n airson sreathan Ăšra, ach bidh sinn fhathast aâ leughadh barrachd dĂ ta na tha riatanach.
Air an t-slighe, nam biodh duilleag gu tur falamh (an dà rna fear san eisimpleir againn) aig deireadh an fhaidhle, bhiodh e comasach dha VACUUM a ghearradh. Ach a-nis tha i sa mheadhan, agus mar sin chan urrainnear dad a dhèanamh leatha.
Nuair a dh'fhà sas an à ireamh de dhuilleagan falamh no gu math tearc, ris an canar bloat, bidh e a 'tòiseachadh a' toirt buaidh air coileanadh.
Is e a h-uile dad a tha air a mhĂŹneachadh gu h-Ă rd meacanaig tachartas bloat ann an clĂ ran. Ann an clĂ ran-amais tha seo aâ tachairt gu ĂŹre mhòr san aon dòigh.
A bheil bloat agam?
Tha grunn dhòighean ann gus faighinn a-mach a bheil bloat agad. Is e am beachd aâ chiad fhear staitistig Postgres a-staigh a chleachdadh, anns a bheil fiosrachadh tuairmseach mun Ă ireamh de shreathan ann an clĂ ran, an Ă ireamh de shreathan âbeòâ, msaa. Ghabh sinn mar bhunait
Is e dòigh eile an leudachadh a chleachdadh
Tha sinn den bheachd gu bheil luach bloat beag, suas ri 20%, iomchaidh. Faodar a mheas mar analogue de fillfactor airson
Dòighean gus sabaid an aghaidh bloat
Tha grunn dhòighean aig Postgres dèiligeadh ri bloat a-mach às a 'bhogsa, ach chan eil iad an-còmhnaidh freagarrach airson a h-uile duine.
Dèan rèiteachadh air AUTOVACUUM gus nach tachair bloat. No nas mionaidiche, airson a chumail aig ĂŹre iomchaidh dhut. Tha e coltach gur e comhairle âcaipteanâ a tha seo, ach ann an da-rĂŹribh chan eil seo an-còmhnaidh furasta a choileanadh. Mar eisimpleir, tha leasachadh gnĂŹomhach agad le atharrachaidhean cunbhalach air an sgeama dĂ ta, no tha seòrsa de dh'imrich dĂ ta a 'tachairt. Mar thoradh air an sin, faodaidh do phròifil luchd atharrachadh gu tric agus mar as trice bidh e ag atharrachadh bho bhòrd gu clĂ r. Tha seo aâ ciallachadh gum feum thu a bhith ag obair beagan air adhart gu cunbhalach agus AUTOVACUUM atharrachadh gu ĂŹomhaigh caochlaideach gach clĂ r. Ach gu follaiseach chan eil seo furasta a dhèanamh.
Is e adhbhar cumanta eile nach urrainn AUTOVACUUM cumail suas ri clĂ ran leis gu bheil gnothaichean fad-Ăšine ann a chuireas casg air bho bhith aâ glanadh an dĂ ta a tha ri fhaighinn leis na gnothaichean sin. Tha am moladh an seo cuideachd follaiseach - cuir Ă s do ghnothaichean âcronnachâ agus lughdaich Ăšine nan gnothaichean gnĂŹomhach. Ach ma tha an luchd air an tagradh agad na mheasgachadh de OLAP agus OLTP, faodaidh tu aig an aon Ă m mòran Ăšrachaidhean tric agus ceistean goirid a bhith agad, a bharrachd air gnĂŹomhachd fad-Ăšine - mar eisimpleir, togail aithisg. Ann an suidheachadh mar sin, is fhiach smaoineachadh mu bhith a 'sgaoileadh an luchd thairis air diofar bhunaitean, a leigeas le gach fear dhiubh a bhith nas mionaidiche.
Eisimpleir eile - eadhon ged a tha am pròifil aon-ghnèitheach, ach gu bheil an stòr-dĂ ta fo luchd gu math Ă rd, is dòcha nach bi eadhon an AUTOVACUUM as ionnsaigheach a âdèiligeadh, agus thig bloat. Is e sgèileadh (dĂŹreach no còmhnard) an aon fhuasgladh.
Dè a nÏ thu ann an suidheachadh far a bheil thu air AUTOVACUUM a stèidheachadh, ach tha am bloat a 'sÏor fhà s.
sgioba VACUUM LĂN ag ath-thogail susbaint chlĂ ran is chlĂ ran-amais agus aâ fĂ gail dĂŹreach dĂ ta buntainneach annta. Gus cuir Ă s do bloat, bidh e ag obair gu foirfe, ach nuair a thèid a chuir gu bĂ s tha glas sònraichte air a âbhòrd air a ghlacadh (AccessExclusiveLock), nach leig le ceistean a chuir an gnĂŹomh air aâ chlĂ r seo, eadhon tagh. Mas urrainn dhut stad a chuir air do sheirbheis no pĂ irt dheth airson Ăšine (bho dheich mionaidean gu grunn uairean a thĂŹde a rèir meud an stòr-dĂ ta agus am bathar-cruaidh agad), is e an roghainn seo as fheĂ rr. Gu mĂŹ-fhortanach, chan eil Ăšine againn VACUUM FULL a ruith rè an cumail suas clĂ raichte, agus mar sin chan eil an dòigh seo freagarrach dhuinn.
sgioba CLAR Ag ath-thogail susbaint chlĂ ran san aon dòigh ri VACUUM FULL, ach a âleigeil leat clĂ r-amais a shònrachadh a rèir an tèid an dĂ ta òrdachadh gu corporra air diosc (ach san Ă m ri teachd chan eil an òrdugh cinnteach airson sreathan Ăšra). Ann an suidheachaidhean sònraichte, tha seo na dheagh optimization airson grunn cheistean - le bhith a 'leughadh ioma-chlĂ ran le clĂ r-amais. Tha ana-cothrom na h-Ă ithne an aon rud ri VACUUM FULL - bidh e aâ glasadh aâ bhĂšird rè obrachadh.
sgioba REINDEX coltach ris an dĂ roimhe, ach ag ath-thogail clĂ r-amais sònraichte no a h-uile clĂ r-amais den chlĂ r. Tha glasan beagan nas laige: ShareLock air aâ bhòrd (aâ cur casg air atharrachaidhean, ach aâ ceadachadh taghadh) agus AccessExclusiveLock air aâ chlĂ r-amais ga ath-thogail (bacadh cheistean aâ cleachdadh aâ chlĂ r-amais seo). Ach, anns an 12mh dreach de Postgres nochd paramadair
Ann an dreachan nas trĂ ithe de Postgres, faodaidh tu toradh coltach ri REINDEX CONCURRENTLY a âcleachdadh
Mar sin, ma tha dòighean ann airson clĂ ran-amais cuir Ă s do bloat âair an iteig,â chan eil gin ann airson bĂšird. Seo far a bheil diofar leudachaidhean taobh a-muigh aâ tighinn a-steach:
Mar a tha pg_repack ag obair
Canaidh sinn gu bheil clĂ r gu tur Ă bhaisteach againn - le clĂ ran-amais, cuingealachaidhean agus, gu mĂŹ-fhortanach, le bloat. Is e aâ chiad cheum de pg_repack clĂ r log a chruthachadh gus dĂ ta a stòradh mu gach atharrachadh fhad âs a tha e aâ ruith. Bidh an inneal-brosnachaidh ag ath-aithris na h-atharrachaidhean sin airson gach cuir a-steach, Ăšrachadh agus cuir Ă s. An uairsin thèid clĂ r a chruthachadh, coltach ris an fhear thĂšsail ann an structar, ach Ă s aonais clĂ ran-amais agus cuingeachaidhean, gus nach cuir iad dĂ il air a âphròiseas cuir a-steach dĂ ta.
An uairsin, bidh pg_repack a âgluasad an dĂ ta bhon t-seann chlĂ r chun chlĂ r Ăšr, aâ sĂŹoladh a-mach gu fèin-ghluasadach a h-uile sreath neo-iomchaidh, agus an uairsin a âcruthachadh clĂ ran-amais airson aâ bhĂšird Ăšr. Nuair a bhios na h-obraichean sin uile air an coileanadh, bidh atharrachaidhean aâ cruinneachadh anns aâ chlĂ r log.
Is e an ath cheum na h-atharrachaidhean a ghluasad chun chlĂ r Ăšr. Bidh an imrich air a dhèanamh thairis air grunn thursan, agus nuair a tha nas lugha na 20 inntrig air fhĂ gail anns aâ chlĂ r log, bidh pg_repack aâ faighinn glas lĂ idir, ag imrich an dĂ ta as Ăšire, agus aâ dol an Ă ite an t-seann chlĂ r leis an fhear Ăšr ann an clĂ ran siostam Postgres. Is e seo an aon Ăšine agus glè ghoirid nuair nach bi e comasach dhut obrachadh leis aâ bhòrd. Ăs deidh seo, thèid an seann bhòrd agus am bòrd le logaichean a dhubhadh Ă s agus thèid Ă ite a shaoradh san t-siostam faidhle. Tha am pròiseas deiseil.
Tha a h-uile dad a 'coimhead math ann an teòiridh, ach dè a thachras ann an cleachdadh? Rinn sinn deuchainn air pg_repack gun luchd agus fo luchd, agus rinn sinn sgrĂšdadh air an obair aige gun fhios nach biodh e ro-luath (ann am faclan eile, aâ cleachdadh Ctrl + C). Bha na deuchainnean uile deimhinneach.
Chaidh sinn dhan stòr bÏdh - agus an uairsin cha deach a h-uile cà il mar a bha dÚil againn.
A 'chiad pancake air a reic
Air aâ chiad bhuidheann fhuair sinn mearachd mu bhith aâ briseadh cuingealachadh sònraichte:
$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed:
ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL: Key (id, index)=(100500, 42) already exists.
Bha clĂ r-amais ainm fèin-ghinte aig aâ chuingealachadh seo_16508 - chaidh a chruthachadh le pg_repack. Stèidhichte air na buadhan a tha air an toirt a-steach don sgrĂŹobhadh aige, cho-dhĂšin sinn an cuingeachadh âarâ a tha a rèir sin. Bâ e an duilgheadas a bhâ ann nach e cuingealachadh gu tur Ă bhaisteach a tha seo, ach cuingealachadh air a chuir dheth (
Cuingeachaidhean dĂ il: carson a tha feum orra agus mar a tha iad ag obair
Beagan teòiridh mu chuingealachaidhean dà il.
Beachdaichidh sinn air eisimpleir shÏmplidh: tha leabhar-stiÚiridh againn de chà raichean le dà fheart - ainm agus òrdugh a 'chà ir anns an eòlaire.
create table cars
(
name text constraint pk_cars primary key,
ord integer not null constraint uk_cars unique
);
Canaidh sinn gum feumadh sinn aâ chiad agus an dĂ rna cĂ r atharrachadh. Is e am fuasgladh sĂŹmplidh aâ chiad luach Ăšrachadh chun dĂ rna fear, agus an dĂ rna fear chun chiad:
begin;
update cars set ord = 2 where name = 'audi';
update cars set ord = 1 where name = 'bmw';
commit;
Ach nuair a bhios sinn aâ ruith aâ chòd seo, tha sinn an dĂšil ri briseadh bacaidh leis gu bheil òrdugh nan luachan sa chlĂ r gun samhail:
[23305] ERROR: duplicate key value violates unique constraint âuk_carsâ
Detail: Key (ord)=(2) already exists.
Ciamar as urrainn dhomh a dhèanamh ann an dòigh eadar-dhealaichte? Roghainn a h-aon: cuir luach a bharrachd an Ă ite òrdugh a tha cinnteach nach bi e sa chlĂ r, mar eisimpleir â-1â. Ann am prògramadh, canar âag iomlaid luachan dĂ chaochladair tro thrian.â Is e an aon eas-bhuannachd den dòigh seo an Ăšrachadh a bharrachd.
Roghainn a dhĂ : Ath-dhealbhaich am bòrd gus seòrsa dĂ ta puing-fleòdraidh a chleachdadh airson luach an òrduigh an Ă ite nan Ă ireamhan iomlan. An uairsin, nuair a bhios tu ag Ăšrachadh an luach bho 1, mar eisimpleir, gu 2.5, bidh a âchiad inntrigeadh gu fèin-ghluasadachâ a âseasamhâ eadar an dĂ rna agus an treas fear. Tha am fuasgladh seo ag obair, ach tha dĂ chuingealachadh ann. An toiseach, chan obraich e dhut ma thèid an luach a chleachdadh an Ă iteigin san eadar-aghaidh. San dĂ rna h-Ă ite, a rèir dè cho mionaideach âs a tha an seòrsa dĂ ta, bidh Ă ireamh chuingealaichte de chuir a-steach a dhâ fhaodadh a bhith agad mus dèan thu ath-Ă ireamhachadh air luachan a h-uile clĂ r.
Roghainn a trĂŹ: cuir aâ bhacadh dheth dheth gus nach tèid a sgrĂšdadh ach aig Ă m aâ gheallaidh:
create table cars
(
name text constraint pk_cars primary key,
ord integer not null constraint uk_cars unique deferrable initially deferred
);
Leis gu bheil loidsig ar ciad iarrtas aâ dèanamh cinnteach gu bheil na luachan uile gun samhail aig Ă m aâ gheallaidh, soirbhichidh e.
Tha an eisimpleir a chaidh a dheasbad gu h-Ă rd, gu dearbh, gu math synthetigeach, ach tha e aâ nochdadh a âbheachd. Anns an tagradh againn, bidh sinn a âcleachdadh cuingeadan dĂ il gus loidsig a chuir an gnĂŹomh a tha an urra ri còmhstrithean fhuasgladh nuair a bhios luchd-cleachdaidh ag obair aig an aon Ă m le nithean widget co-roinnte air aâ bhòrd. Le bhith aâ cleachdadh a leithid de chuingealachaidhean leigidh sin leinn an còd tagraidh a dhèanamh beagan nas sĂŹmplidhe.
San fharsaingeachd, a rèir an seòrsa cuingealachadh, tha trÏ Ïrean granularity aig Postgres airson an sgrÚdadh: Ïrean sreath, malairt, agus faireachdainn.
Source:
Bithear an-còmhnaidh aâ sgrĂšdadh CHECK and NOT NULL aig ĂŹre na loidhne; airson cuingeachaidhean eile, mar a chithear bhon chlĂ r, tha diofar roghainnean ann. Faodaidh tu barrachd a leughadh
Gus geĂ rr-chunntas goirid a dhèanamh, tha cuingealachaidhean dĂ il ann an grunn shuidheachaidhean a 'toirt seachad còd nas leughaidh agus nas lugha de dh' òrdughan. Ach, feumaidh tu pĂ igheadh ââââairson seo le bhith a 'dèanamh iom-fhillte air a' phròiseas dĂŹ-bhugachaidh, leis gu bheil a 'mhionaid a' tachairt agus a 'mhionaid a gheibh thu a-mach mu dheidhinn air an sgaradh ann an Ăšine. Is e duilgheadas eile a dhâ fhaodadh a bhith ann gur dòcha nach bi an neach-clĂ raidh an-còmhnaidh comasach air plana as fheĂ rr a thogail ma tha an t-iarrtas aâ toirt a-steach cuingealachadh dĂ il.
Leasachadh air pg_repack
Tha sinn air dèiligeadh ri dè na cuingeadan a chaidh a chuir dheth, ach ciamar a tha iad co-cheangailte ris an duilgheadas againn? Cuimhnichidh sinn aâ mhearachd a fhuair sinn na bu thrĂ ithe:
$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed:
ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL: Key (id, index)=(100500, 42) already exists.
Bidh e aâ tachairt nuair a thèid dĂ ta a chopaigeadh bho chlĂ r log gu clĂ r Ăšr. Tha seo a' coimhead neònach oir... tha an dĂ ta sa chlĂ r log air a ghealltainn còmhla ris an dĂ ta sa chlĂ r stòr. Ma choinnicheas iad ri cuingealachaidhean aâ chiad chlĂ r, ciamar as urrainn dhaibh na h-aon chuingealachaidhean a bhriseadh anns an fhear Ăšr?
Mar a thionndaidh e, tha freumh na trioblaid na laighe anns a 'cheum roimhe de pg_repack, a tha a' cruthachadh clà ran-amais a-mhà in, ach chan e cuingealachaidhean: bha cuingealachadh sònraichte aig an t-seann chlà r, agus chruthaich am fear Úr clà r-amais sònraichte na à ite.
Tha e cudromach toirt fa-near an seo ma tha an cuingealachadh Ă bhaisteach agus gun a bhith air a chuir dheth, gu bheil an clĂ r-amais sònraichte a chaidh a chruthachadh na Ă ite co-ionann ris aâ bhacadh seo, oir Tha cuingealachaidhean sònraichte ann am Postgres air an cur an gnĂŹomh le bhith aâ cruthachadh clĂ r-amais gun samhail. Ach ann an cĂšis cuingealachadh dĂ il, chan eil an giĂšlan mar an ceudna, oir chan urrainnear an clĂ r-amais a chuir dheth agus tha e an-còmhnaidh air a sgrĂšdadh aig an Ă m a thèid an òrdugh sql a chuir gu bĂ s.
Mar sin, tha brĂŹgh na trioblaid na laighe ann an "dĂ il" an t-seic: anns a 'chlĂ r tĂšsail tha e a' tachairt aig Ă m a 'gheallaidh, agus anns a' chlĂ r Ăšr aig an Ă m a thèid an òrdugh sql a chur gu bĂ s. Tha seo aâ ciallachadh gum feum sinn dèanamh cinnteach gun tèid na sgrĂšdaidhean a dhèanamh mar an ceudna anns gach cĂšis: an-còmhnaidh dĂ il no an-còmhnaidh sa bhad.
Mar sin dè na beachdan a bhâ againn?
Cruthaich clĂ r-amais coltach ri dĂ il
Is e aâ chiad bheachd an dĂ sgrĂšdadh a dhèanamh sa mhodh sa bhad. Dhâ fhaodadh seo grunn chuingealachaidhean meallta a ghineadh, ach ma tha glè bheag dhiubh ann, cha bu chòir seo buaidh a thoirt air obair luchd-cleachdaidh, leis gu bheil còmhstri mar sin nan suidheachadh Ă bhaisteach dhaibh. Bidh iad a âtachairt, mar eisimpleir, nuair a thòisicheas dĂ neach-cleachdaidh aâ deasachadh an aon widget aig an aon Ă m, agus nach eil Ăšine aig teachdaiche an dĂ rna neach-cleachdaidh fiosrachadh fhaighinn gu bheil am widget mu thrĂ th air a bhacadh airson deasachadh leis a âchiad neach-cleachdaidh. Ann an suidheachadh mar sin, bidh am frithealaiche aâ diĂšltadh an dĂ rna neach-cleachdaidh, agus bidh an neach-dèiligidh aige aâ toirt air ais na h-atharrachaidhean agus aâ bacadh aâ widget. Beagan nas fhaide air adhart, nuair a chuireas aâ chiad neach-cleachdaidh crĂŹoch air deasachadh, gheibh an dĂ rna fear fiosrachadh nach eil am widget air a bhacadh tuilleadh agus bidh e comasach dhaibh an gnĂŹomh aca ath-aithris.
Gus dèanamh cinnteach gu bheil sgrĂšdaidhean an-còmhnaidh ann am modh nach deach a chuir dheth, chruthaich sinn clĂ r-amais Ăšr coltach ris aâ bhacadh tĂšsail a chaidh a chuir dheth:
CREATE UNIQUE INDEX CONCURRENTLY uk_tablename__immediate ON tablename (id, index);
-- run pg_repack
DROP INDEX CONCURRENTLY uk_tablename__immediate;
Anns an Ă rainneachd deuchainn, cha dâ fhuair sinn ach beagan mhearachdan ris an robh dĂšil. Soirbheachas! Ruith sinn pg_repack a-rithist air cinneasachadh agus fhuair sinn 5 mearachdan air aâ chiad bhuidheann ann an uair a thĂŹde de dhâ obair. Is e toradh iomchaidh a tha seo. Ach, mu thrĂ th air an dĂ rna buidheann chaidh an Ă ireamh de mhearachdan suas gu mòr agus bha againn ri stad a chuir air pg_repack.
Carson a thachair e? Tha an coltas gun tachair mearachd an urra ri cia mheud neach-cleachdaidh a tha ag obair leis na h-aon widgets aig an aon Ă m. A rèir choltais, aig an Ă m sin bha mòran nas lugha de dhâ atharrachaidhean farpaiseach ann leis an dĂ ta air a stòradh air aâ chiad bhuidheann na bha air an fheadhainn eile, i.e. bha sinn dĂŹreach âfortanachâ.
Cha do dhâobraich am beachd. Aig an ĂŹre sin, chunnaic sinn dĂ fhuasgladh eile: ath-sgrĂŹobh an còd tagraidh againn gus cuir Ă s do chuingealachaidhean dĂ il, no âteachâ pg_repack gus obrachadh leotha. Thagh sinn an dĂ rna fear.
Cuir cuingeadan dĂ il bhon chlĂ r thĂšsail an Ă ite clĂ ran-amais sa chlĂ r Ăšr
Bha adhbhar an ath-sgrÚdaidh follaiseach - ma tha cuingealachadh dà il air a 'chlà r tÚsail, an uairsin airson an tè Úr feumaidh tu a leithid de chuingealachadh a chruthachadh, agus chan e clà r-amais.
Gus na h-atharrachaidhean againn a dhearbhadh, sgrĂŹobh sinn deuchainn shĂŹmplidh:
- clĂ r le cuingealachadh dĂ il agus aon chlĂ r;
- cuir a-steach dĂ ta ann an lĂšb a tha an aghaidh clĂ r a tha ann mar-thĂ ;
- dèan Ăšrachadh - chan eil an dĂ ta aâ strĂŹ tuilleadh;
- na h-atharrachaidhean a dhèanamh.
create table test_table
(
id serial,
val int,
constraint uk_test_table__val unique (val) deferrable initially deferred
);
INSERT INTO test_table (val) VALUES (0);
FOR i IN 1..10000 LOOP
BEGIN
INSERT INTO test_table VALUES (0) RETURNING id INTO v_id;
UPDATE test_table set val = i where id = v_id;
COMMIT;
END;
END LOOP;
Thuit an dreach tĂšsail de pg_repack an-còmhnaidh air aâ chiad chuir a-steach, dhâ obraich an dreach atharraichte gun mhearachdan. Sgoinneil.
Bidh sinn aâ dol gu cinneasachadh agus a-rithist aâ faighinn mearachd aig an aon ĂŹre de chopaigeadh dĂ ta bhon chlĂ r log gu fear Ăšr:
$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed:
ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL: Key (id, index)=(100500, 42) already exists.
Suidheachadh clasaigeach: bidh a h-uile dad ag obair ann an Ă rainneachdan deuchainn, ach chan ann ann an cinneasachadh?!
APPLY_COUNT agus ceangal dĂ bhaidse
Thòisich sinn air aâ chòd a mhion-sgrĂšdadh gu litireil loidhne air loidhne agus lorg sinn puing chudromach: tha dĂ ta air a ghluasad bhon chlĂ r log gu fear Ăšr ann an baidsean, chomharraich an seasmhach APPLY_COUNT meud aâ bhaidse:
for (;;)
{
num = apply_log(connection, table, APPLY_COUNT);
if (num > MIN_TUPLES_BEFORE_SWITCH)
continue; /* there might be still some tuples, repeat. */
...
}
Is e an duilgheadas a th âann gum faod an dĂ ta bhon ghnothach tĂšsail, anns am faodadh grunn obrachaidhean an cuingealachadh a bhriseadh, nuair a thèid a ghluasad, a thighinn gu crĂŹch aig snaim dĂ bhaidse - thèid leth de na h-òrdughan a ghealltainn anns aâ chiad baidse, agus an leth eile anns an dara. Agus an seo, a rèir do fhortan: mura h-eil na sgiobaidhean a 'briseadh rud sam bith anns a' chiad bhaidse, tha a h-uile dad gu math, ach ma nĂŹ iad, bidh mearachd a 'tachairt.
Tha APPLY_COUNT co-ionann ri 1000 clĂ r, a tha aâ mĂŹneachadh carson a bha na deuchainnean againn soirbheachail - cha do chòmhdaich iad cĂšis âbatch snaimâ. Chleachd sinn dĂ Ă ithne - cuir a-steach agus Ăšraich, agus mar sin bha dĂŹreach 500 gnĂŹomh de dhĂ Ă ithne an-còmhnaidh air an cur ann am baidse agus cha robh duilgheadas sam bith againn. Ăs deidh dhuinn an dĂ rna Ăšrachadh a chuir ris, sguir an deasachadh againn ag obair:
FOR i IN 1..10000 LOOP
BEGIN
INSERT INTO test_table VALUES (1) RETURNING id INTO v_id;
UPDATE test_table set val = i where id = v_id;
UPDATE test_table set val = i where id = v_id; -- one more update
COMMIT;
END;
END LOOP;
Mar sin, is e an ath ghnĂŹomh dèanamh cinnteach gu bheil dĂ ta bhon chlĂ r tĂšsail, a chaidh atharrachadh ann an aon ghnothach, aâ tighinn gu crĂŹch sa chlĂ r Ăšr cuideachd taobh a-staigh aon ghnothach.
A 'diĂšltadh bho bhith a' sgoltadh
Agus a-rithist bha dĂ fhuasgladh againn. An toiseach: fĂ gaidh sinn gu tur sgaradh ann an baidsean agus gluasad dĂ ta ann an aon ghnothach. Bâ e buannachd an fhuasglaidh seo cho sĂŹmplidh âs a bha e - cha robh na h-atharrachaidhean còd riatanach ach glè bheag (co-dhiĂš, ann an dreachan nas sine dhâ obraich pg_reorg dĂŹreach mar sin). Ach tha duilgheadas ann - tha sinn a 'cruthachadh malairt fad-Ăšine, agus tha seo, mar a chaidh a rĂ dh roimhe, na chunnart do bhith a' nochdadh bloat Ăšr.
Tha an dĂ rna fuasgladh nas iom-fhillte, ach is dòcha nas ceart: cruthaich colbh anns a 'chlĂ r log le aithnichear a' ghnothaich a chuir dĂ ta ris a 'chlĂ r. An uairsin, nuair a nĂŹ sinn leth-bhreac den dĂ ta, is urrainn dhuinn a chuir còmhla leis aâ fheart seo agus dèanamh cinnteach gu bheil atharrachaidhean co-cheangailte air an gluasad còmhla. Thèid am baidse a chruthachadh bho ghrunn ghnothaichean (no aon mhòr) agus bidh a mheud ag atharrachadh a rèir dè an ĂŹre de dhĂ ta a chaidh atharrachadh anns na gnothaichean sin. Tha e cudromach cuimhneachadh, leis gu bheil dĂ ta bho dhiofar ghnothaichean aâ dol a-steach don chlĂ r log ann an òrdugh air thuaiream, cha bhith e comasach tuilleadh a leughadh ann an òrdugh, mar a bha e roimhe. seqscan airson gach iarrtas le sĂŹoladh le tx_id ro dhaor, tha feum air clĂ r-amais, ach maillichidh e cuideachd air aâ mhodh mar thoradh air an Ăšrachadh a bharrachd. San fharsaingeachd, mar as Ă bhaist, feumaidh tu rudeigin a thoirt seachad.
Mar sin, chuir sinn romhainn tòiseachadh leis a 'chiad roghainn, oir tha e nas sĂŹmplidh. An toiseach, bha e riatanach tuigsinn am biodh gnothach fada na fhĂŹor dhuilgheadas. Leis gu bheil am prĂŹomh ghluasad dĂ ta bhon t-seann chlĂ r chun chlĂ r Ăšr cuideachd a âtachairt ann an aon ghnothach fada, dhâ atharraich a âcheist guâ dè an ĂŹre a mheudaicheas sinn a âghnothach seo?â Tha fad aâ chiad ghnothaich an urra gu mòr ri meud aâ chlĂ ir. Tha fad fear Ăšr an urra ri cia mheud atharrachadh a bhios aâ cruinneachadh sa chlĂ r aig Ă m gluasad dĂ ta, i.e. air dian an luchd. Thachair an ruith pg_repack aig Ă m far nach robh mòran eallach seirbheis ann, agus bha meud nan atharrachaidhean gu math beag an taca ri meud tĂšsail aâ chlĂ ir. Cho-dhĂšin sinn gum faodadh sinn dearmad a dhèanamh air Ă m malairt Ăšr (airson coimeas, gu cuibheasach tha e 1 uair agus 2-3 mionaidean).
Bha na deuchainnean adhartach. Cuir air bhog air cinneasachadh cuideachd. Airson soilleireachd, seo dealbh le meud aon de na stòran-dà ta às deidh dha ruith:
Leis gu robh sinn gu tur riaraichte leis an fhuasgladh seo, cha do dh'fheuch sinn ris an dĂ rna fear a chuir an gnĂŹomh, ach tha sinn a 'beachdachadh air a' chomas a bhith a 'bruidhinn ris an luchd-leasachaidh leudachaidh. Gu mĂŹ-fhortanach, chan eil an ath-sgrĂšdadh a thâ againn an-drĂ sta deiseil airson fhoillseachadh, leis nach do dhâ fhuasgail sinn ach an duilgheadas le cuingeachaidhean gun samhail a chaidh a chuir dheth, agus airson bad lĂ n-chuimseach feumar taic a thoirt do sheòrsan eile. Tha sinn an dòchas gun urrainn dhuinn seo a dhèanamh san Ă m ri teachd.
Is dòcha gu bheil ceist agad, carson a chaidh sinn eadhon an sĂ s anns an sgeulachd seo le atharrachadh pg_repack, agus nach do chleachd sinn, mar eisimpleir, na analogues aige? Aig Ă m air choreigin bha sinn cuideachd a 'smaoineachadh mu dheidhinn seo, ach thug an deagh eòlas air a bhith ga chleachdadh na bu trĂ ithe, air bĂšird gun chuingealachaidhean dĂ il, sinn a' feuchainn ri brĂŹgh na trioblaid a thuigsinn agus a rèiteachadh. A bharrachd air an sin, tha feum air Ăšine airson deuchainnean a dhèanamh le bhith aâ cleachdadh fhuasglaidhean eile, agus mar sin cho-dhĂšin sinn gum feuchadh sinn an-toiseach ris an duilgheadas a cheartachadh ann, agus nan do thuig sinn nach bâ urrainn dhuinn seo a dhèanamh ann an Ăšine reusanta, thòisicheadh ââââsinn aâ coimhead air analogues. .
toraidhean
Dè as urrainn dhuinn a mholadh stèidhichte air ar n-eòlas fhèin:
- Cum sĂšil air do bhodhaig. Stèidhichte air dĂ ta sgrĂšdaidh, tuigidh tu dè cho math âs a tha autovacuum air a rèiteachadh.
- Atharraich AUTOVACUUM gus bloat a chumail aig ĂŹre iomchaidh.
- Ma tha am bloat fhathast a 'fĂ s agus nach urrainn dhut faighinn thairis air le bhith a' cleachdadh innealan taobh a-muigh a 'bhogsa, na biodh eagal ort leudachadh a-muigh a chleachdadh. Is e am prĂŹomh rud a h-uile dad a dhearbhadh gu math.
- Na biodh eagal ort fuasglaidhean bhon taobh a-muigh atharrachadh a rèir do fheumalachdan - uaireannan faodaidh seo a bhith nas èifeachdaiche agus eadhon nas fhasa na bhith ag atharrachadh do chòd fhèin.
Source: www.habr.com