Antipatterns PostgreSQL: atharraich dàta a’ dol seachad air inneal-brosnachaidh

Nas luaithe no nas fhaide air adhart, tha mòran a' cur aghaidh ris an fheum air rudeigin a rèiteachadh gu mòr ann an clàran a' chlàir. Tha agam mar-thà innis dhomh mar a nì mi e nas fheàrr, agus ciamar - tha e nas fheàrr gun a bhith ga dhèanamh. An-diugh bruidhnidh mi mun dàrna taobh den ùrachadh mòr - mu dheidhinn draibhearan.

Mar eisimpleir, air bòrd anns am feum thu rudeigin a chàradh, tha inneal-brosnachaidh olc an crochadh ON UPDATE, a 'gluasad a h-uile atharrachadh gu cuid de cho-chruinneachaidhean. Agus feumaidh tu a h-uile càil ùrachadh (cuir raon ùr air bhog, mar eisimpleir) gus nach bi buaidh air na co-chruinneachaidhean sin.

Leig leinn dìreach na brosnachaidhean a chuir dheth!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
  UPDATE ...; -- тут долго-долго
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

Gu fìrinneach, tha sin uile - tha a h-uile dad an crochadh.

Air sgàth sin ALTER TABLE a' sparradh Cothrom air leth- glas fon nach eil duine a 'ruith ann an co-shìnte, eadhon fear sìmplidh SELECT, nach urrainn dad a leughadh bhon chlàr. Is e sin, gus an tig an gnothach seo gu crìch, fuirichidh a h-uile duine a tha airson eadhon “dìreach leughadh”. Agus tha cuimhne againn air sin UPDATE tha ùine fhada againn ...

Tionndaidh sinn dheth gu sgiobalta, agus an uairsin tionndaidh air gu sgiobalta!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
COMMIT;

UPDATE ...;

BEGIN;
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

An seo tha an suidheachadh mar-thà nas fheàrr, tha an ùine feitheimh mòran nas lugha. Ach chan eil ach dà dhuilgheadas a 'milleadh a h-uile bòidhchead:

  • ALTER TABLE bidh e fhèin a’ feitheamh ris a h-uile gnìomh eile air a’ bhòrd, a’ gabhail a-steach feadhainn fhada SELECT
  • Fhad ‘s a tha an inneal-brosnachaidh dheth "itealaich le" atharrachadh sam bith anns a' bhòrd, cha'n e mhain sinne. Agus cha tèid e a-steach do na cruinneachaidhean, ged a bu chòir. Trioblaid!

A’ riaghladh caochladairean seisean

Mar sin, anns an dreach roimhe, thuit sinn air puing bhunaiteach - feumaidh sinn dòigh air choireigin a theagasg gus na h-atharrachaidhean “ar” sa chlàr a dhealachadh bho “chan e sinne”. Tha “sinn” air an leum mar a tha, ach air “chan e sinne” tha iad air am piobrachadh. Airson seo faodaidh tu a chleachdadh caochladairean seisean.

seisean_replication_ròl

Leugh leabhar-làimhe:

Tha an uidheamachd brosnachaidh cuideachd a’ toirt buaidh air an caochladair rèiteachaidh seisean_replication_ròl. Air a chomasachadh às aonais stiùireadh a bharrachd (bunaiteach), loisgidh luchd-brosnachaidh nuair a tha an dreuchd mac-samhail “tùs” (àbhaisteach) no “ionadail”. Triggers air an comasachadh le bhith a 'sònrachadh ENABLE REPLICA, obraichidh e a-mhàin ma tha modh seisean làithreach - “mac-samhail”, agus luchd-brosnachaidh air an comasachadh le bhith a’ sònrachadh ENABLE ALWAYS, obraichidh e ge bith dè am modh ath-riochdachadh gnàthach.

Cuiridh mi cuideam gu sònraichte air nach eil an suidheachadh a’ buntainn ris na h-uile aig an aon àm, mar ALTER TABLE, ach a-mhàin don cheangal shònraichte againn. Gu h-iomlan, gus nach toir tagradh sam bith obair:

SET session_replication_role = replica; -- выключили триггеры
UPDATE ...;
SET session_replication_role = DEFAULT; -- вернули в исходное состояние

Suidheachadh taobh a-staigh an inneal-brosnachaidh

Ach bidh an roghainn gu h-àrd ag obair airson a h-uile inneal-brosnachaidh aig an aon àm (no feumaidh tu luchd-brosnachaidh “eile” ro-làimh nach eil thu airson a chuir dheth). Agus ma tha feum againn "cuir dheth" aon inneal-brosnachaidh sònraichte?

Cuidichidh seo sinn caochladair seisean “cleachdaiche”.:

Tha ainmean paramadair leudachaidh air an sgrìobhadh mar a leanas: an t-ainm leudachaidh air a leantainn le dot agus an uairsin ainm a’ pharamadair fhèin, coltach ri ainmean làn nì ann an SQL. Mar eisimpleir: plpgsql.variable_conflict.
Leis gum faodar roghainnean taobh a-muigh an t-siostaim a shuidheachadh ann am pròiseasan nach luchdaich am modal leudachaidh iomchaidh, tha PostgreSQL a’ gabhail ris luachan airson ainmean sam bith le dà phàirt.

An toiseach, cuiridh sinn crìoch air an inneal-brosnachaidh, rudeigin mar seo:

BEGIN
    -- процессу конвертации можно делать все
    IF current_setting('mycfg.my_table_convert_process') = 'TRUE' THEN
        IF TG_OP IN ('INSERT', 'UPDATE') THEN
            RETURN NEW;
        ELSE
            RETURN OLD;
        END IF;
    END IF;
...

Co-dhiù, faodar seo a dhèanamh "airson prothaid", gun bacadh, troimhe CREATE OR REPLACE airson gnìomh brosnachaidh. Agus an uairsin anns a 'cheangal shònraichte bidh sinn a' coileach "ar" caochlaideach:


SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; -- вернули в исходное состояние

A bheil sibh eòlach air dòighean eile? Co-roinn anns na beachdan.

Source: www.habr.com

Cuir beachd ann