An cuimhin leat conas a thosaigh sé ar fad. Bhí gach rud den chéad uair agus arís eile

Faoi conas a bhí orm déileáil le leas iomlán a bhaint ceisteanna PostgreSQL agus cad a tháinig as seo go léir.
Cén fáth go raibh ort? Sea, mar gheall ar na 4 bliana roimhe sin d'oibrigh gach rud go ciúin, go socair, mar a bhí clog ag tic.
mar epigraph.

An cuimhin leat conas a thosaigh sé ar fad. Bhí gach rud den chéad uair agus arís eile

Bunaithe ar imeachtaí fíor.
Athraíodh na hainmneacha go léir, tá comhtharlú randamach.

Nuair a bhaintear toradh áirithe amach, tá sé suimiúil cuimhneamh i gcónaí cad a bhí mar spreagadh don tús, conas a thosaigh sé ar fad.

Mar sin, tá cur síos gairid ar an méid a tharla mar thoradh air san alt “Sintéis mar cheann de na modhanna chun feidhmíocht PostgreSQL a fheabhsú'.

Is dócha go mbeidh sé suimiúil an slabhra imeachtaí roimhe seo a athchruthú.
Choinnigh an stair an dáta tosaigh cruinn - 2018-09-10 18:02:48.
Chomh maith leis sin, sa scéal tá iarratas ónar thosaigh sé ar fad:
Iarratas fadhbROGHNAIGH
lch. "PARAMETER_ID" mar pharameter_id,
lch. "PD_NAME" AS pd_name,
lch. "CUSTOMER_PARTNUMBER" MAR uimhir chustaiméir_pháirte,
w."LRM" AS LRM,
w. "LOTID" AS lotid,
w. "RTD_VALUE" AS RTD_value,
w. "LOWER_SPEC_LIMIT" AS ísle_spec_limit,
w. "UPPER_SPEC_LIMIT" AS uachtair_spec_teorainn,
p." TYPE_CALCUL" cineál_calcul AS,
s."SPENT_NAME" AS spent_name,
s."SPENT_DATE" AS caite_dáta,
sliocht (bliain ó "SPENT_DATE") MAR bhliain,
sliocht (mí ó "SPENT_DATE") mar mhí,
s." REPORT_NAME" AS tuairisc_ainm,
lch. "STPM_NAME" AS stpm_name,
p."CUSTOMERPARAM_NAME" AS customerparam_name
Ó wdataw,
chaith s,
pmtrp,
caite_pdsp,
lch lch
CÁ s."SPENT_ID" = w."SPENT_ID"
AGUS p."PARAMETER_ID" = w. "PARAMETER_ID"
AGUS s."SPENT_ID" = sp. "SPENT_ID"
AGUS lch." PD_ID" = sp. "PD_ID"
AND s."SPENT_DATE" > = '2018-07-01' AGUS s."SPENT_DATE" <= '2018-09-30'
agus s."SPENT_DATE" = (SELECT MAX(s2. "SPENT_DATE")
Ó chaith s2,
sonraí w2
ÁIT s2."SPENT_ID" = w2."SPENT_ID"
AGUS w2."LRM" = w."LRM");


Cur síos ar an bhfadhb, caighdeánach intuartha - “Tá gach rud go dona. Inis dom cad é an fhadhb."
Chuimhnigh mé láithreach ar joke ó na huaire de thiomáineann 3 orlach go leith:

Tagann an lamer chuig an hacker.
- Ní oibríonn aon rud dom, inis dom cá bhfuil an fhadhb.
-In DNA...

Ach, ar ndóigh, ní hé seo an bealach chun teagmhais feidhmíochta a réiteach. “Seans nach dtuigtear sinn" (Le). An riachtanas is gá a dhéanamh amach é.
Bhuel, déanaimis tochailt. B'fhéidir go mbeidh a charnadh mar thoradh air.

An cuimhin leat conas a thosaigh sé ar fad. Bhí gach rud den chéad uair agus arís eile

infheistíocht tosaithe

Mar sin, cad is féidir a fheiceáil láithreach leis an tsúil naked, gan fiú dul i muinín an chabhair MÍNIÚ.
1) Ní úsáidtear JOINs. Tá sé seo olc, go háirithe má tá líon na nasc níos mó ná aon.
2) Ach cad atá níos measa fós - subquery chomhghaolú, ina theannta sin, le comhiomlán. Tá sé seo an-dona.
Tá sé seo go dona, ar ndóigh. Ach níl sé seo ach ar thaobh amháin. Ar an láimh eile, tá sé seo an-mhaith, toisc go soiléir go bhfuil réiteach ar an bhfadhb agus is féidir an t-iarratas a fheabhsú.
Ná téigh go dtí an fortuneteller (C).
Níl plean na gceisteanna chomh casta sin, ach táscach go leor:
Plean forghníomhaitheAn cuimhin leat conas a thosaigh sé ar fad. Bhí gach rud den chéad uair agus arís eile

An ceann is suimiúla agus úsáideach, mar is gnách, ag tús agus ag deireadh.
Lúb Neadaithe (costas=935.84..479763226.18 sraitheanna=3322 leithead=135) (am iarbhír=31.536..8220420.295 sraitheanna=8111656 lúb=1)
Am pleanála: 3.807ms
Am forghníomhaithe: 8222351.640ms
Tá an t-am forghníomhaithe níos mó ná 2 uair an chloig.

An cuimhin leat conas a thosaigh sé ar fad. Bhí gach rud den chéad uair agus arís eile

hipitéisí bréagacha a ghlac am

Hipitéis 1- Tá an t-optimizer mícheart, tógann sé an plean mícheart.

Chun an plean forghníomhaithe a shamhlú, bainfimid úsáid as an suíomh https://explain.depesz.com/. Mar sin féin, níor léirigh an suíomh aon rud suimiúil nó úsáideach. Ar an gcéad amharc agus an dara - rud ar bith a d'fhéadfadh cabhrú i ndáiríre. Ach amháin - tá Scan Iomlán íosta. Lean ar aghaidh.

Hipitéis 2-Tionchar ar an mbonn ó thaobh an autovacuum, ní mór duit fáil réidh leis na coscáin.

Ach, go n-iompraíonn deamhan an autovacuum go maith, níl aon phróisis fad-chrochta ann. Aon ualach tromchúiseach - uimh. An riachtanas is gá a chuardach le haghaidh rud éigin eile.

Tá Hipitéis 3-Staitisticí as dáta, ní mór duit cuileoga gach rud a athríomh

Arís, ní sin. Tá na staitisticí cothrom le dáta. Ní haon ionadh é sin, mar gheall ar an easpa fadhbanna le autovacuum.

Ag tosú a bharrfheabhsú

Is cinnte nach bhfuil an príomhthábla ‘wdata’ beag, beagnach 3 mhilliún taifead.
Agus is ar an mbord seo a théann Full Scan.

Coinníoll Hash: ((w."SPENT_ID" = s. "SPENT_ID") AGUS ((Fo-Phlean 1) = s. "SPENT_DATE"))
-> Scanadh Seq ar wdata w (costas=0.00..574151.49 sraitheanna=26886249 leithead=46) (am iarbhír=0.005..8153.565 sraitheanna=26873950 lúb=1)
Feidhmímid mar chaighdeán: “Déanaimis innéacs agus eitilt gach rud”.
Déanta innéacs ar an réimse "SPENT_ID"
Mar thoradh:
Ceist plean forghníomhaithe ag baint úsáide as innéacsAn cuimhin leat conas a thosaigh sé ar fad. Bhí gach rud den chéad uair agus arís eile

Bhuel, ar chabhraigh sé?
Bhí sé: 8 222 351.640 ms (beagán os cionn 2 uair an chloig)
tháinig sé chun bheith: 6 985 431.575 ms (beagnach 2 uair an chloig)
Go ginearálta, na húlla céanna, dearcadh taobh.
Cuimhnímis ar na clasaicí:
“An bhfuil an ceann céanna agat, ach gan sciatháin? Lorgóidh”.

An cuimhin leat conas a thosaigh sé ar fad. Bhí gach rud den chéad uair agus arís eile

I bprionsabal, d'fhéadfaí toradh maith a thabhairt air seo, go maith, ní maith, ach inghlactha. Ar a laghad, cuir tuairisc mhór ar fáil don chustaiméir ag cur síos ar an méid atá déanta agus cén fáth a bhfuil an méid atá déanta go maith.
Mar sin féin, tá an cinneadh deiridh fós i bhfad ar shiúl. An-i bhfad.

Agus anois an rud is suimiúla - leanaimid orainn ag uasmhéadú, déanfaimid snas ar an gceist

Céim a haon - bain úsáid as JOIN

Ceist athscríofa, cuma mar seo anois (go maith ar a laghad níos deise):
Iarratas le JOINROGHNAIGH
lch. "PARAMETER_ID" mar pharameter_id,
lch. "PD_NAME" AS pd_name,
lch. "CUSTOMER_PARTNUMBER" MAR uimhir chustaiméir_pháirte,
w."LRM" AS LRM,
w. "LOTID" AS lotid,
w. "RTD_VALUE" AS RTD_value,
w. "LOWER_SPEC_LIMIT" AS ísle_spec_limit,
w. "UPPER_SPEC_LIMIT" AS uachtair_spec_teorainn,
p." TYPE_CALCUL" cineál_calcul AS,
s."SPENT_NAME" AS spent_name,
s."SPENT_DATE" AS caite_dáta,
sliocht (bliain ó "SPENT_DATE") MAR bhliain,
sliocht (mí ó "SPENT_DATE") mar mhí,
s." REPORT_NAME" AS tuairisc_ainm,
lch. "STPM_NAME" AS stpm_name,
p."CUSTOMERPARAM_NAME" AS customerparam_name
Ó wdata chaith INNER JOIN s AR w."SPENT_ID" = s. "SPENT_ID"
Glac páirt INNER pmtr p AR p."PARAMETER_ID" = w."PARAMETER_ID"
INNER JOIN spent_pd sp AR s."SPENT_ID" = sp. "SPENT_ID"
Glac páirt INNER pd ON pd."PD_ID" = sp. "PD_ID"
ÁIT
s."SPENT_DATE" > = '2018-07-01' AGUS s."SPENT_DATE" <= '2018-09-30'AND
s."SPENT_DATE" = (SELECT MAX(s2. "SPENT_DATE")
Ó wdata w2 INNER JOIN caite s2 AR w2."SPENT_ID" = s2. "SPENT_ID"
JOIN INNER wdata w
AR w2."LRM" = w."LRM" );
Am pleanála: 2.486ms
Am forghníomhaithe: 1223680.326ms

Mar sin tá anseo an chéad toradh.
Bhí sé: 6 985 431.575 ms (beagnach 2 uair an chloig).
tháinig sé chun bheith: 1 223 680.326 ms (beagán os cionn 20 nóiméad).
Toradh maith. I bprionsabal, arís, d'fhéadfaí stop a chur ansin. Ach mar sin uninteresting, ní féidir leat a stopadh.
FOR

An cuimhin leat conas a thosaigh sé ar fad. Bhí gach rud den chéad uair agus arís eile

Céim a Dó - Faigh réidh leis an subquery comhghaolaithe

Téacs iarratais athraithe:
Gan aon fhocheist chomhghaolaitheROGHNAIGH
lch. "PARAMETER_ID" mar pharameter_id,
lch. "PD_NAME" AS pd_name,
lch. "CUSTOMER_PARTNUMBER" MAR uimhir chustaiméir_pháirte,
w."LRM" AS LRM,
w. "LOTID" AS lotid,
w. "RTD_VALUE" AS RTD_value,
w. "LOWER_SPEC_LIMIT" AS ísle_spec_limit,
w. "UPPER_SPEC_LIMIT" AS uachtair_spec_teorainn,
p." TYPE_CALCUL" cineál_calcul AS,
s."SPENT_NAME" AS spent_name,
s."SPENT_DATE" AS caite_dáta,
sliocht (bliain ó "SPENT_DATE") MAR bhliain,
sliocht (mí ó "SPENT_DATE") mar mhí,
s." REPORT_NAME" AS tuairisc_ainm,
lch. "STPM_NAME" AS stpm_name,
p."CUSTOMERPARAM_NAME" AS customerparam_name
Ó wdata chaith INNER JOIN s AR s."SPENT_ID" = w."SPENT_ID"
Glac páirt INNER pmtr p AR p."PARAMETER_ID" = w."PARAMETER_ID"
INNER JOIN spent_pd sp AR s."SPENT_ID" = sp. "SPENT_ID"
Glac páirt INNER pd ON pd."PD_ID" = sp. "PD_ID"
INNER JOIN (SELECT w2."LRM", MAX(s2."SPENT_DATE")
Ó caitheadh ​​s2 INNER JOIN wdata w2 ON s2."SPENT_ID" = w2."SPENT_ID"
GRÚPA DE RÉIR w2.LRM
) md ar w."LRM" = md. "LRM"
ÁIT
s."SPENT_DATE" > = '2018-07-01' AGUS s."SPENT_DATE" <= '2018-09-30';
Am pleanála: 2.291ms
Am forghníomhaithe: 165021.870ms

Bhí sé: 1 223 680.326 ms (beagán os cionn 20 nóiméad).
tháinig sé chun bheith: 165 021.870 ms (beagán os cionn 2 nóiméad).
Tá sé seo sách maith cheana féin.
Mar sin féin, mar a deir na Sasanaigh,Ach, tá i gcónaí ach“. Ba chóir go gcuirfeadh toradh ró-mhaith amhras faoi deara go huathoibríoch. Tá rud éigin mícheart anseo.

Tá an hipitéis maidir leis an gceist a cheartú chun fáil réidh leis an subquery comhghaolaithe ceart. Ach teastaíonn beagán tweaking uaidh chun an toradh deiridh a fháil i gceart.
Mar thoradh air sin, an chéad toradh idirmheánach:
Ceist curtha in eagar gan focheist chomhghaolaitheROGHNAIGH
lch. "PARAMETER_ID" mar pharameter_id,
lch. "PD_NAME" AS pd_name,
lch. "CUSTOMER_PARTNUMBER" MAR uimhir chustaiméir_pháirte,
w."LRM" AS LRM,
w. "LOTID" AS lotid,
w. "RTD_VALUE" AS RTD_value,
w. "LOWER_SPEC_LIMIT" AS ísle_spec_limit,
w. "UPPER_SPEC_LIMIT" AS uachtair_spec_teorainn,
p." TYPE_CALCUL" cineál_calcul AS,
s."SPENT_NAME" AS spent_name,
s."SPENT_DATE" AS caite_dáta,
sliocht (bliain as s. "SPENT_DATE") MAR bhliain,
sliocht (mí ó s. "SPENT_DATE") mar mhí,
s." REPORT_NAME" AS tuairisc_ainm,
lch. "STPM_NAME" AS stpm_name,
p."CUSTOMERPARAM_NAME" AS customerparam_name
Ó wdata chaith INNER JOIN s AR s."SPENT_ID" = w."SPENT_ID"
Glac páirt INNER pmtr p AR p."PARAMETER_ID" = w."PARAMETER_ID"
INNER JOIN spent_pd sp AR s."SPENT_ID" = sp. "SPENT_ID"
Glac páirt INNER pd ON pd."PD_ID" = sp. "PD_ID"
INNER JOIN (SELECT w2."LRM", MAX(s2."SPENT_DATE") MAR "SPENT_DATE"
Ó caitheadh ​​s2 INNER JOIN wdata w2 ON s2."SPENT_ID" = w2."SPENT_ID"
GRÚPA DE RÉIR w2.LRM
) md AR md."SPENT_DATE" = s."SPENT_DATE" AGUS md."LRM" = w."LRM"
ÁIT
s."SPENT_DATE" > = '2018-07-01' AGUS s."SPENT_DATE" <= '2018-09-30';
Am pleanála: 3.192ms
Am forghníomhaithe: 208014.134ms

Mar sin, is é an rud atá againn mar thoradh air ná an chéad toradh inghlactha, rud nach bhfuil náire orainn a thaispeáint don chustaiméir:
Thosaigh le: 8 222 351.640 ms (níos mó ná 2 uair an chloig)
Bainte amach: 1 ms (beagán os cionn 223 nóiméad).
Toradh (idirmheánach): 208 014.134 ms (beagán os cionn 3 nóiméad).

Toradh den scoth.

An cuimhin leat conas a thosaigh sé ar fad. Bhí gach rud den chéad uair agus arís eile

Iomlán na

D'fhéadfadh sé seo a bheith stoptha.
ACH…
Tagann appetite le hithe. Beidh an bóthar a máistreacht ag siúl. Tá aon toradh idirmheánach. Stop marbh. Etc.
Leanaimis ar aghaidh leis an leas iomlán a bhaint.
Smaoineamh iontach. Go háirithe ag smaoineamh nach raibh an custaiméir fiú ina choinne. Agus fiú go láidir - le haghaidh.

Mar sin, tá sé in am an bunachar sonraí a athdhearadh. Ní féidir an struchtúr ceiste féin a bharrfheabhsú a thuilleadh (cé, mar a d'éirigh sé amach níos déanaí, tá rogha ann gach rud a eitilt i ndáiríre). Ach anois chun dearadh an bhunachair sonraí a bharrfheabhsú agus a fhorbairt, is smaoineamh an-gheallta é seo cheana féin. Agus is tábhachtaí suimiúil. Arís, cuimhnigh ar an óige. Tar éis an tsaoil, níor tháinig mé ina DBA láithreach, d'fhás mé as ríomhchláraitheoirí (bunúsach, cóimeálaí, si, si móide faoi dhó, oracle, plsql). Ábhar suimiúil, ar ndóigh, le haghaidh cuimhní cinn ar leith ;-).
Mar sin féin, a ligean ar digress.

Mar sin,

An cuimhin leat conas a thosaigh sé ar fad. Bhí gach rud den chéad uair agus arís eile

Agus b'fhéidir go gcuideoidh rannánú linn?
Spoiler - "Sea, chabhraigh sé, agus i optimizing feidhmíochta, lena n-áirítear."

Ach sin scéal go hiomlán difriúil...

Le leanúint ar aghaidh…

Foinse: will.com

Add a comment