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.
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 “
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.
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íomhaithe
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.
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
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éacs
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”.
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
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.
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,
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