PostgreSQL Antipatterns: ọgụ ìgwè ndị "nwụrụ anwụ"

Ihe dị iche iche nke usoro ime PostgreSQL na-enye ya ohere ịdị ngwa ngwa n'ọnọdụ ụfọdụ yana "ọ bụghị ngwa ngwa" na ndị ọzọ. Taa, anyị ga-elekwasị anya na ọmụmaatụ ama ama nke esemokwu n'etiti otu DBMS si arụ ọrụ yana ihe onye nrụpụta na-eji ya - Mmelite vs ụkpụrụ MVCC.

Akụkọ dị nkenke sitere na nnukwu isiokwu:

Mgbe ejiri iwu Nwelite gbanwee ahịrị, a na-arụ ọrụ abụọ n'ezie: HIchapụ na INSERT. N'ime ụdị eriri ugbu a xmax ka edobere ya na ọnụọgụ azụmahịa nke mere mmelite ahụ. Mgbe ahụ, e kere ya ụdị ọhụrụ otu ahịrị; uru xmin ya dabara na uru xmax nke ụdị gara aga.

Oge ụfọdụ ka emechara azụmahịa a, ụdị ochie ma ọ bụ nke ọhụrụ, dabere na ya COMMIT/ROOLBACK, a ga-amata "nwụrụ anwụ" (ndị nwụrụ anwụ) mgbe ị na-agafe VACUUM dị ka tebụl ma kpochapụ.

PostgreSQL Antipatterns: ọgụ ìgwè ndị "nwụrụ anwụ"

Ma nke a agaghị eme ozugbo, ma nsogbu na "ndị nwụrụ anwụ" nwere ike nweta ngwa ngwa - na ugboro ugboro ma ọ bụ uka update nke ndekọ na nnukwu tebụl, na obere oge ka e mesịrị, ị ga-ezute otu ọnọdụ ahụ VACUUM agaghị enwe ike inye aka.

#1: Ọ na-amasị m ịkwaga ya

Ka anyị kwuo na usoro gị na-arụ ọrụ na mgbagha azụmahịa, na mberede ọ ghọtara na ọ ga-adị mkpa imelite mpaghara X na ndekọ ụfọdụ:

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

Mgbe ahụ, ka ogbugbu na-aga n'ihu, ọ na-apụta na a ga-emelitekwa ubi Y:

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

... na mgbe ahụ Z - gịnị kpatara na-atụfu oge na obere ihe?

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

Ụdị ndekọ ole ka anyị nwere ugbu a na nchekwa data? ee, 4 iberibe! N'ime ndị a, otu dị mkpa, na 3 ga-asachapụ gị site na [auto]VACUM.

Emela ya otú a! Jiri na-emelite mpaghara niile n'otu arịrịọ - ọ fọrọ nke nta ka ọ bụrụ mgbe niile, enwere ike ịgbanwe echiche nke usoro ahụ dị ka nke a:

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

#2: Jiri dị iche na, Luk!

Yabụ, ị ka chọrọ imelite ọtụtụ, ọtụtụ ndekọ na tebụl (n'oge eji edemede ma ọ bụ ntụgharị, dịka ọmụmaatụ). Na ihe dị ka nke a na-efeba na edemede:

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

A arịrịọ na mkpokọta ụdị a na-emekarị na ọ fọrọ nke nta ka ọ bụrụ mgbe niile ọ bụghị iji mejupụta ubi ọhụrụ efu, kama iji dozie ụfọdụ njehie na data. N'otu oge ahụ, ya onwe ya A naghị eburu n'uche izi ezi nke data dị ugbu a ma ọlị - ma n'efu! Ya bụ, a na-edegharị ihe ndekọ ahụ, ọ bụrụgodị na ọ nwere kpọmkwem ihe a chọrọ - ma gịnị kpatara ya? Ka anyị dozie ya:

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

Ọtụtụ ndị mmadụ amaghị maka ịdị adị nke onye ọrụ dị ebube dị otú a, yabụ ebe a bụ mpempe akwụkwọ aghụghọ IS DISTINCT FROM na ndị ọrụ ezi uche ndị ọzọ iji nyere aka:
PostgreSQL Antipatterns: ọgụ ìgwè ndị "nwụrụ anwụ"
... na ntakịrị banyere arụmọrụ na mgbagwoju anya ROW()-okwu:
PostgreSQL Antipatterns: ọgụ ìgwè ndị "nwụrụ anwụ"

#3: Amatara m obi m site na... igbochi

na-amalite ọrụ abụọ yiri usoro, nke ọ bụla n'ime ha na-agbalị kanye akara ntinye na ọ "na-aga n'ihu":

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

Ọbụlagodi na usoro ndị a na-eme ihe na-adabereghị na ibe ha, mana n'ime otu ID ahụ, onye ahịa nke abụọ ga-akpọchi “arịrịọ a” ruo mgbe azụmaahịa mbụ ga-agwụ.

Ngwọta #1: A na-ebelata ọrụ ahụ na nke gara aga

Ka anyị tinye ya ọzọ IS DISTINCT FROM:

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

N'ụdị a, arịrịọ nke abụọ agaghị agbanwe ihe ọ bụla na nchekwa data, ihe niile adịlarị ka ọ kwesịrị ịdị - yabụ, igbochi agaghị eme. Na-esote, anyị na-edozi eziokwu nke "ịchọghị" ndekọ na algọridim etinyere.

Ngwọta #2: mkpọchi ndụmọdụ

Nnukwu isiokwu maka edemede dị iche, nke ị nwere ike ịgụ banyere ya ụzọ nke ngwa na "rake" nke nkwanye nkwanye.

Ngwọta #3: oku nzuzu

Ma nke a bụ kpọmkwem ihe kwesịrị ime gị arụ ọrụ n'out oge na otu ndekọ? Ma ọ bụ ị mejọrọ algọridim maka ịkpọ mgbagha azụmahịa n'akụkụ ndị ahịa, dịka ọmụmaatụ? Ma ọ bụrụ na ị na-eche maka ya? ..

isi: www.habr.com

Tinye a comment