Ṣe o ranti bi gbogbo rẹ ṣe bẹrẹ. Ohun gbogbo wà fun igba akọkọ ati lẹẹkansi

Nipa bii a ṣe ni lati mu ibeere PostgreSQL dara si ati kini o jade ninu gbogbo rẹ.
Kini idi ti o ni lati? Bẹẹni, nitori fun awọn ọdun 4 ti tẹlẹ ohun gbogbo ṣiṣẹ laiparuwo, ni ifọkanbalẹ, bi aago kan.
Bi apọju.

Ṣe o ranti bi gbogbo rẹ ṣe bẹrẹ. Ohun gbogbo wà fun igba akọkọ ati lẹẹkansi

Da lori awọn iṣẹlẹ gidi.
Gbogbo awọn orukọ ti a ti yi pada, coincidences wa ni ID.

Nigbati o ba ṣaṣeyọri abajade kan, o jẹ igbadun nigbagbogbo lati ranti kini iwuri fun ibẹrẹ, nibiti gbogbo rẹ ti bẹrẹ.

Nítorí náà, ohun tó ṣẹlẹ̀ gẹ́gẹ́ bí ìyọrísí rẹ̀ ni a ṣàpèjúwe ní ṣókí nínú àpilẹ̀kọ náà “Akopọ bi ọkan ninu awọn ọna fun ilọsiwaju iṣẹ PostgreSQL».

O ṣee ṣe yoo jẹ ohun ti o nifẹ lati ṣe atunṣe pq ti awọn iṣẹlẹ iṣaaju.
Awọn itan ti o ti fipamọ awọn gangan ibere ọjọ - 2018-09-10 18:02:48.
Paapaa, ninu itan naa ibeere kan wa lati eyiti gbogbo rẹ bẹrẹ:
Ibere ​​isoroYan
p."PARAMETER_ID" bi paramita_id,
pd."PD_NAME" AS pd_name,
pd."CUSTOMER_PARTNUMBER" BI onibara_partnumber,
w. "LRM" BI LRM,
w. "LOTID" BI lotid,
w.“RTD_VALUE” BI RTD_iye,
w.“LOWER_SPEC_LIMIT” BI lower_spec_limit,
w.“UPPER_SPEC_LIMIT” BI oke_spec_limit,
p"TYPE_CALCUL" BI iru_iṣiro,
s."SPENT_NAME" AS lo_orukọ,
s. "SPENT_DATE" BI o ti lo_ọjọ,
jade(odun lati "SPENT_DATE") BI odun,
jade (osu lati "SPENT_DATE") bi oṣu,
s."REPORT_NAME" AS oruko_iroyin,
p."STPM_NAME" AS stpm_name,
p.“CUSTOMERPARAM_NAME” BI clientparam_name
LATI wdata w,
lo s,
pmtr p,
lo_pd sp,
pd pd
Nibo s. "SPENT_ID" = w. "SPENT_ID"
ÀTI p."PARAMETER_ID" = w."PARAMETER_ID"
ATI s.“SPENT_ID” = sp.“SPENT_ID”
ATI pd."PD_ID" = sp."PD_ID"
ÀTI s.“SPENT_DATE” >= '2018-07-01' ÀTI s. "SPENT_DATE" <= '2018-09-30'
ati s.“SPENT_DATE” = (Yan MAX(s2.“SPENT_DATE”)
LATI inawo s2,
wdata w2
NIBI s2. "SPENT_ID" = w2. "SPENT_ID"
ATI w2.“LRM” = w.“LRM”);


Apejuwe iṣoro naa jẹ boṣewa asọtẹlẹ - “Ohun gbogbo ko dara. Sọ fun mi kini iṣoro naa. ”
Lẹsẹkẹsẹ Mo ranti akọọlẹ itan kan lati awọn akoko ti awọn awakọ 3 ati idaji inch kan:

Lamer wa si agbonaeburuwole.
-Ko si ohun ti o ṣiṣẹ fun mi, so fun mi ibi ti awọn isoro ni.
- Ninu DNA ...

Ṣugbọn dajudaju, eyi kii ṣe ọna lati yanju awọn iṣẹlẹ iṣẹ. "Wọn le ma loye wa"(Pẹlu). A nilo lati ro ero rẹ.
O dara, jẹ ki a ma wà. Boya ohun kan yoo kojọpọ bi abajade.

Ṣe o ranti bi gbogbo rẹ ṣe bẹrẹ. Ohun gbogbo wà fun igba akọkọ ati lẹẹkansi

Iwadi bere

Nitorinaa, kini o le rii lẹsẹkẹsẹ pẹlu oju ihoho, laisi paapaa lilo si EXPLAIN.
1) Awọn JOIN ko lo. Eyi jẹ buburu, paapaa ti nọmba awọn asopọ ba ju ọkan lọ.
2) Ṣugbọn ohun ti o buruju paapaa ni awọn ibeere isọdọkan, pẹlupẹlu, pẹlu akojọpọ. Eyi buru pupọ.
Eyi jẹ buburu dajudaju. Ṣugbọn eyi jẹ nikan ni ọwọ kan. Ni apa keji, eyi dara pupọ, nitori pe iṣoro naa ni kedere ni ojutu ati ibeere ti o le ni ilọsiwaju.
Maṣe lọ si ọdọ babalawo (C).
Eto ibeere naa kii ṣe idiju yẹn, ṣugbọn o jẹ itọkasi pupọ:
Eto ipaniyanṢe o ranti bi gbogbo rẹ ṣe bẹrẹ. Ohun gbogbo wà fun igba akọkọ ati lẹẹkansi

Ohun ti o nifẹ julọ ati iwulo, bi igbagbogbo, wa ni ibẹrẹ ati ipari.
Yipo iteeye (iye owo=935.84..479763226.18 awọn ori ila=3322 iwọn=135) (akoko gidi=31.536..8220420.295 awọn ori ila=8111656 loops=1)
Akoko igbogun: 3.807 ms
Akoko ipaniyan: 8222351.640 ms
Akoko ipari jẹ diẹ sii ju wakati 2 lọ.

Ṣe o ranti bi gbogbo rẹ ṣe bẹrẹ. Ohun gbogbo wà fun igba akọkọ ati lẹẹkansi

Awọn idawọle eke ti o gba akoko

Itumọ 1 - Oluṣapeye ṣe aṣiṣe ati kọ ero ti ko tọ.

Lati wo eto ipaniyan, a yoo lo aaye naa https://explain.depesz.com/. Sibẹsibẹ, aaye naa ko ṣe afihan ohunkohun ti o nifẹ tabi iwulo. Ni wiwo akọkọ ati keji, ko si nkankan ti o le ṣe iranlọwọ gaan. Ṣe o ṣee ṣe pe Ayẹwo kikun jẹ iwonba. Tẹ siwaju.

Hypothesis 2-Ipa lori ipilẹ lati ẹgbẹ autovacuum, o nilo lati yọ awọn idaduro kuro.

Ṣugbọn awọn daemons autovacuum huwa daradara, ko si awọn ilana isunmọ gigun. Ko si ẹru to ṣe pataki. A nilo lati wa nkan miiran.

Itumọ 3 - Awọn iṣiro ti wa ni igba atijọ, ohun gbogbo nilo lati tun ṣe iṣiro

Lẹẹkansi, kii ṣe iyẹn. Awọn iṣiro wa titi di oni. Ewo, fun aini awọn iṣoro pẹlu autovacuum, kii ṣe iyalẹnu.

Jẹ ki a bẹrẹ iṣapeye

Tabili akọkọ 'wdata' jẹ esan kii ṣe kekere, o fẹrẹ to awọn igbasilẹ miliọnu 3.
Ati pe o jẹ tabili yii ti Ṣiṣayẹwo ni kikun tẹle.

Hash Cond: ((w"SPENT_ID" = s."SPENT_ID") ATI ((SubPlan 1) = s."SPENT_DATE")
-> Seq wíwo lori wdata w (owo = 0.00..574151.49 awọn ori ila = 26886249 iwọn = 46) (akoko gidi = 0.005..8153.565 awọn ori ila = 26873950 losiwajulosehin = 1)
A ṣe ohun boṣewa: “Wá, jẹ ki a ṣe atọka ati ohun gbogbo yoo fo.”
Ṣẹda atọka lori aaye "SPENT_ID".
Nitorina na:
Eto ipaniyan ibeere nipa lilo atọkaṢe o ranti bi gbogbo rẹ ṣe bẹrẹ. Ohun gbogbo wà fun igba akọkọ ati lẹẹkansi

O dara, ṣe o ṣe iranlọwọ?
je: 8 222ms (diẹ diẹ sii ju wakati 2 lọ)
di: 6 985 431.575 ms (fere wakati 2)
Ni gbogbogbo, awọn apples kanna, wiwo ẹgbẹ.
Jẹ ki a ranti awọn alailẹgbẹ:
“Ṣe o ni ọkan kanna, ṣugbọn laisi iyẹ? Yoo wa".

Ṣe o ranti bi gbogbo rẹ ṣe bẹrẹ. Ohun gbogbo wà fun igba akọkọ ati lẹẹkansi

Ni opo, eyi le pe ni abajade to dara, daradara, kii ṣe dara, ṣugbọn itẹwọgba. Ni o kere ju, pese ijabọ nla kan si alabara ti n ṣalaye iye ti a ti ṣe ati idi ti ohun ti o ṣe dara.
Ṣugbọn sibẹ, ipinnu ikẹhin ṣi jina. O jinna pupọ.

Ati ni bayi ohun ti o nifẹ julọ - a tẹsiwaju lati mu dara, a yoo ṣe didan ibeere naa

Igbesẹ Ọkan - Lo Darapọ mọ

Ibeere ti a tun kọ ni bayi dabi eyi (daradara ni o kere diẹ lẹwa):
Ibeere nipa lilo JOINYan
p."PARAMETER_ID" bi paramita_id,
pd."PD_NAME" AS pd_name,
pd."CUSTOMER_PARTNUMBER" BI onibara_partnumber,
w. "LRM" BI LRM,
w. "LOTID" BI lotid,
w.“RTD_VALUE” BI RTD_iye,
w.“LOWER_SPEC_LIMIT” BI lower_spec_limit,
w.“UPPER_SPEC_LIMIT” BI oke_spec_limit,
p"TYPE_CALCUL" BI iru_iṣiro,
s."SPENT_NAME" AS lo_orukọ,
s. "SPENT_DATE" BI o ti lo_ọjọ,
jade(odun lati "SPENT_DATE") BI odun,
jade (osu lati "SPENT_DATE") bi oṣu,
s."REPORT_NAME" AS oruko_iroyin,
p."STPM_NAME" AS stpm_name,
p.“CUSTOMERPARAM_NAME” BI clientparam_name
LATI wdata w INU INU JOIN lo s LORI w.“SPENT_ID”=s.”“SPENT_ID”
INU INU DỌ pmtr p LORI p.“PARAMETER_ID” = w.“PARAMETER_ID”
INU INU JOIN spend_pd sp LORI s.“SPENT_ID” = sp.“SPENT_ID”
Darapọ mọ inu inu pd pd LORI pd.“PD_ID” = sp.“PD_ID”
Nibo
s.“SPENT_DATE” >= '2018-07-01' ATI s.“SPENT_DATE” <= '2018-09-30'AND
s.“SPENT_DATE” = (Yan MAX(s2.“SPENT_DATE”)
LATI wdata w2 INU INU JOIN lo s2 LORI w2.“SPENT_ID”=s2.“SPENT_ID”
INU INU Wdata w
LORI w2.“LRM” = w.“LRM” );
Akoko igbogun: 2.486 ms
Akoko ipaniyan: 1223680.326 ms

Nitorinaa, abajade akọkọ.
je: 6 ms (fere wakati 985).
di: 1 223 680.326 ms (o ju 20 iṣẹju lọ).
Abajade to dara. Ni opo, lẹẹkansi, a le da nibẹ. Ṣugbọn o jẹ ohun ti ko nifẹ, o ko le da duro.
FUN

Ṣe o ranti bi gbogbo rẹ ṣe bẹrẹ. Ohun gbogbo wà fun igba akọkọ ati lẹẹkansi

Igbesẹ meji - yọkuro kuro ni abẹlẹ ti o ni ibatan

Yi ọrọ ibeere pada:
Laisi isọdọmọ subqueryYan
p."PARAMETER_ID" bi paramita_id,
pd."PD_NAME" AS pd_name,
pd."CUSTOMER_PARTNUMBER" BI onibara_partnumber,
w. "LRM" BI LRM,
w. "LOTID" BI lotid,
w.“RTD_VALUE” BI RTD_iye,
w.“LOWER_SPEC_LIMIT” BI lower_spec_limit,
w.“UPPER_SPEC_LIMIT” BI oke_spec_limit,
p"TYPE_CALCUL" BI iru_iṣiro,
s."SPENT_NAME" AS lo_orukọ,
s. "SPENT_DATE" BI o ti lo_ọjọ,
jade(odun lati "SPENT_DATE") BI odun,
jade (osu lati "SPENT_DATE") bi oṣu,
s."REPORT_NAME" AS oruko_iroyin,
p."STPM_NAME" AS stpm_name,
p.“CUSTOMERPARAM_NAME” BI clientparam_name
LATI wdata w INU INU JOIN lo s LORI s.“SPENT_ID” = w.“SPENT_ID”
INU INU DỌ pmtr p LORI p.“PARAMETER_ID” = w.“PARAMETER_ID”
INU INU JOIN spend_pd sp LORI s.“SPENT_ID” = sp.“SPENT_ID”
Darapọ mọ inu inu pd pd LORI pd.“PD_ID” = sp.“PD_ID”
Darapọ mọ INU (Yan w2.“LRM”, MAX(s2.“SPENT_DATE”)
LATI na s2 INU JOIN wdata w2 LORI s2.“SPENT_ID” = w2.“SPENT_ID”
EGBE LATIPA w2.“LRM”
) md lori w.“LRM” = md.“LRM”
Nibo
s."SPENT_DATE" >= '2018-07-01' ATI s."SPENT_DATE" <= '2018-09-30';
Akoko igbogun: 2.291 ms
Akoko ipaniyan: 165021.870 ms

je: 1 223 680.326 ms (o ju 20 iṣẹju lọ).
di: 165 021.870 ms (o kan ju 2 iṣẹju).
Eyi ti dara tẹlẹ.
Sibẹsibẹ, bi awọn British sọ "Ṣugbọn, nigbagbogbo wa ṣugbọn" Abajade ti o dara ju yẹ ki o fa ifura mu laifọwọyi. Nkankan burujai ni.

Idawọle nipa atunse ibeere naa lati yọkuro ifọrọwewe ti o ni ibatan jẹ deede. Ṣugbọn o nilo lati tweak diẹ diẹ fun abajade ikẹhin lati jẹ deede.
Bi abajade, abajade agbedemeji akọkọ:
Ibeere ti a ṣatunkọ laisi ibeere ti o ni ibatanYan
p."PARAMETER_ID" bi paramita_id,
pd."PD_NAME" AS pd_name,
pd."CUSTOMER_PARTNUMBER" BI onibara_partnumber,
w. "LRM" BI LRM,
w. "LOTID" BI lotid,
w.“RTD_VALUE” BI RTD_iye,
w.“LOWER_SPEC_LIMIT” BI lower_spec_limit,
w.“UPPER_SPEC_LIMIT” BI oke_spec_limit,
p"TYPE_CALCUL" BI iru_iṣiro,
s."SPENT_NAME" AS lo_orukọ,
s. "SPENT_DATE" BI o ti lo_ọjọ,
jade (odun lati s. "SPENT_DATE") BI ọdun,
jade (osu lati s. "SPENT_DATE") bi oṣu,
s."REPORT_NAME" AS oruko_iroyin,
p."STPM_NAME" AS stpm_name,
p.“CUSTOMERPARAM_NAME” BI clientparam_name
LATI wdata w INU INU JOIN lo s LORI s.“SPENT_ID” = w.“SPENT_ID”
INU INU DỌ pmtr p LORI p.“PARAMETER_ID” = w.“PARAMETER_ID”
INU INU JOIN spend_pd sp LORI s.“SPENT_ID” = sp.“SPENT_ID”
Darapọ mọ inu inu pd pd LORI pd.“PD_ID” = sp.“PD_ID”
Darapọ mọ INU (Yan w2.“LRM”, MAX(s2.“SPENT_DATE”) BI “SPENT_DATE”
LATI na s2 INU JOIN wdata w2 LORI s2.“SPENT_ID” = w2.“SPENT_ID”
EGBE LATIPA w2.“LRM”
) md LORI md.“SPENT_DATE” = s.“SPENT_DATE”ATI md.“LRM” = w.“LRM”
Nibo
s."SPENT_DATE" >= '2018-07-01' ATI s."SPENT_DATE" <= '2018-09-30';
Akoko igbogun: 3.192 ms
Akoko ipaniyan: 208014.134 ms

Nitorinaa, ohun ti a pari pẹlu ni abajade itẹwọgba akọkọ, eyiti kii ṣe itiju lati ṣafihan si alabara:
Bibẹrẹ pẹlu: 8 222 351.640 ms (diẹ sii ju wakati 2 lọ)
A ṣakoso lati ṣaṣeyọri: 1 ms (diẹ diẹ sii ju awọn iṣẹju 223).
Abajade (akoko): 208 014.134 ms (o kan ju 3 iṣẹju).

Abajade to dara julọ.

Ṣe o ranti bi gbogbo rẹ ṣe bẹrẹ. Ohun gbogbo wà fun igba akọkọ ati lẹẹkansi

Abajade

A le ti duro nibẹ.
SUGBON…
Awọn yanilenu wa pẹlu jijẹ. Ẹni tí ó bá ń rìn ni yóò mọ ọ̀nà. Eyikeyi abajade jẹ agbedemeji. Duro o si kú. Ati bẹbẹ lọ.
Jẹ ki a tẹsiwaju iṣapeye.
Ero nla. Paapa ni akiyesi pe alabara ko paapaa lokan. Ati paapaa ni agbara fun o.

Nitorinaa, o to akoko fun atunto data. Ilana ibeere funrararẹ ko le ṣe iṣapeye (botilẹjẹpe, bi o ti yipada nigbamii, aṣayan wa lati rii daju pe ohun gbogbo kuna). Ṣugbọn lati bẹrẹ iṣapeye ati idagbasoke apẹrẹ data jẹ tẹlẹ imọran ti o ni ileri pupọ. Ati pataki julọ awon. Lẹẹkansi, ranti igba ewe rẹ. Emi ko di DBA lẹsẹkẹsẹ, Mo dagba bi olutọpa (BASIC, assembler, C, double-plus C, Oracle, plsql). Koko-ọrọ ti o nifẹ, nitorinaa, fun iwe-iranti lọtọ ;-).
Sibẹsibẹ, maṣe jẹ ki a ni idamu.

Ati bẹ,

Ṣe o ranti bi gbogbo rẹ ṣe bẹrẹ. Ohun gbogbo wà fun igba akọkọ ati lẹẹkansi

Tabi boya ipinya yoo ran wa lọwọ?
Apanirun - “Bẹẹni, o ṣe iranlọwọ, pẹlu ni iṣapeye iṣẹ.”

Ṣugbọn iyẹn jẹ itan ti o yatọ patapata…

A tun ma a se ni ojo iwaju…

orisun: www.habr.com

Fi ọrọìwòye kun