ืขื ืืื ืืืืชื ืฆืจืื ืืืืขื ืืช ืฉืืืืชืช PostgreSQL ืืื ืืฆื ืืื ืื.
ืืื ืืืืช ืืืื? ืื, ืื ืืืฉื 4 ืืฉื ืื ืืงืืืืืช ืืื ืขืื ืืฉืงื, ืืจืืืข, ืืื ืฉืขืื ืืชืงืชืง.
ืืชืืจ ืืคืืืจืฃ.
ืืืืกืก ืขื ืืืจืืขืื ืืืืชืืื.
ืื ืืฉืืืช ืฉืื ื, ืฆืืจืืคื ืืงืจืื ืื ืืงืจืืืื.
ืืืฉืจ ืืชื ืืฉืื ืชืืฆืื ืืกืืืืช, ืชืืื ืืขื ืืื ืืืืืืจ ืื ืืื ืืืืฃ ืืืชืืื, ืืืคื ืืื ืืชืืื.
ืื ืื ืฉืงืจื ืืชืืฆืื ืืื ืืชืืืจ ืืงืฆืจื ืืืืืจ "
ืื ืจืื ืืืื ืืขื ืืื ืืฉืืืจ ืืช ืฉืจืฉืจืช ืืืืจืืขืื ืืงืืืืื.
ืืืืกืืืจืื ืฉืืจื ืืช ืชืืจืื ืืืชืืื ืืืืืืง - 2018-09-10 18:02:48.
ืืื ืื, ืืกืืคืืจ ืืฉ ืืงืฉื ืฉืืื ื ืืื ืืชืืื:
ืืงืฉืช ืืขืืืืืืืจ
p.โPARAMETER_IDโ ืืชืืจ parameter_id,
pd."PD_NAME" AS pd_name,
pd."CUSTOMER_PARTNUMBER" AS customer_partnumber,
w. "LRM" AS LRM,
w. "LOTID" AS lotid,
w.โRTD_VALUEโ AS RTD_value,
w.โLOWER_SPEC_LIMITโ AS lower_spec_limit,
w.โUPPER_SPEC_LIMITโ AS upper_spec_limit,
p."TYPE_CALCUL" AS type_calcul,
s."SPENT_NAME" AS spend_name,
s.โSPENT_DATEโ AS spent_date,
extract(year from "SPENT_DATE") AS year,
extract(month from "SPENT_DATE") ืืืืืฉ,
s."REPORT_NAME" AS report_name,
p."STPM_NAME" AS stpm_name,
p.โCUSTOMERPARAM_NAMEโ AS customerparam_name
ื-wdata w,
ืืืื s,
pmtr p,
spend_pd sp,
pd pd
WHERE s.โSPENT_IDโ = w.โSPENT_IDโ
ื-p."PARAMETER_ID" = w."PARAMETER_ID"
AND s.โSPENT_IDโ = sp.โSPENT_IDโ
AND pd."PD_ID" = sp."PD_ID"
AND s.โSPENT_DATEโ >= '2018-07-01' ื-s.โSPENT_DATEโ <= '2018-09-30'
ื-s.โSPENT_DATEโ = (ืืืจ MAX(s2.โSPENT_DATEโ)
ืืืืฆืืช s2,
wdata w2
WHERE s2.โSPENT_IDโ = w2.โSPENT_IDโ
AND w2.โLRMโ = w.โLRMโ);
ืชืืืืจ ืืืขืื ืืื ืืฆืคืื ืกืื ืืจืื - "ืืื ืจืข. ืกืคืจ ืื ืื ืืืขืื."
ืืื ื ืืืจืชื ืืื ืงืืืื ืืืืื ืื ืฉื ืืื ื ืื ืฉื 3 ืืืฆื ืืื ืฅ':
ืืืืืจ ืืืืข ืื ืืืืงืจ.
-ืฉืื ืืืจ ืื ืขืืื ืื, ืชืืื ืื ืืืคื ืืืขืื.
-ื-DNA...
ืืื ืืืืื, ืื ืื ืืืจื ืืคืชืืจ ืชืงืจืืืช ืืืฆืืขืื. "ืืืื ืื ืื ืืืื ืื ืืืชื ื" (ืขื). ืื ืื ื ืฆืจืืืื ืืืืื ืืช ืื.
ืืืื, ืืื ื ืืคืืจ. ืืืื ืืฉืื ืืฆืืืจ ืืชืืฆืื ืืื.
ืืืื ืืงืืจื
ืื ืื ื ืืชื ืืจืืืช ืืื ืืขืื ืืืชื ืืืืื ืช, ืืคืืื ืืื ืืืืืงืง ืืืกืืจ.
1) ืืื ืฉืืืืฉ ื-JOIN. ืื ืจืข, ืืืืืื ืื ืืกืคืจ ืืืืืืจืื ืืื ืืืชืจ ืืืื.
2) ืืื ืื ืฉืืจืืข ืขืื ืืืชืจ ืืื ืฉืืืืชืืช ืืฉื ื ืืชืืืืืช, ืืชืจ ืขื ืื, ืขื ืฆืืืจื. ืื ืจืข ืืืื.
ืื ืจืข ืืืืื. ืืื ืื ืจืง ืืฆื ืืื. ืืฆื ืฉื ื, ืื ืืื ืืืื, ืื ืืืขืื ืืจืืจ ืฉืืฉ ืคืชืจืื ืืืงืฉื ืฉื ืืชื ืืฉืคืจ.
ืื ืชืื ืืืื ืขืชืืืืช (ื).
ืชืืื ืืช ืืฉืืืืชืืช ืื ืื ืื ืืกืืืืช, ืืื ืืื ืื ืืขืืื:
ืชืืื ืืช ืืืฆืืข
ืืืขื ืืื ืืืฉืืืืฉื ืืืืชืจ, ืืจืืื, ืืื ืืืชืืื ืืืกืืฃ.
ืืืืื ืืงืื ื ืช (ืขืืืช=935.84..479763226.18 ืฉืืจืืช=3322 ืจืืื=135) (ืืื ืืคืืขื=31.536..8220420.295 ืฉืืจืืช=8111656 ืืืืืืช=1)
ืืื ืชืื ืื: 3.807 ืืืคืืืช ืืฉื ืืื
ืืื ืืืฆืืข: 8222351.640 ms
ืืื ืืืฉืืื ืืื ืืืชืจ ืืฉืขืชืืื.
ืืฉืขืจืืช ืฉืืื ืฉืืงื ืืื
ืืฉืขืจื 1 - ืืืืืขื ืขืืฉื ืืขืืช ืืืื ื ืืช ืืชืืื ืืช ืืื ื ืืื ื.
ืืื ืืืืืืฉ ืืช ืชืืื ืืช ืืืืฆืืข, ื ืฉืชืืฉ ืืืชืจ
ืืฉืขืจื 2-ืืฉืคืขื ืขื ืืืกืืก ืืฆื ืืืืืงืื ืืืืืืืื, ืืชื ืฆืจืื ืืืืคืืจ ืืืืืืื.
ืืื ืืืื ื ืืืืืงืื ืืืืืืืืืื ืืชื ืืืื ืืืื, ืืื ืชืืืืืื ืฉื ืืฉืืื ืืื ืจื. ืืื ืขืืืก ืจืฆืื ื. ืื ืื ื ืฆืจืืืื ืืืคืฉ ืืฉืื ืืืจ.
ืืฉืขืจื 3 - ืืกืืืืกืืืงื ืืืืฉื ืช, ืฆืจืื ืืืฉื ืืื ืืืืฉ
ืฉืื, ืื ืื. ืืกืืืืกืืืงื ืืขืืืื ืช. ืื, ืืืชืืฉื ืืืืขืืจ ืืขืืืช ืขื ืืืงืื ืืืืืืื, ืื ืืคืชืืข.
ืืืื ื ืชืืื ืืืฆืข ืืืคืืืืืืฆืื
ืืืืื ืืจืืฉืืช 'wdata' ืืื ืืืืื ืื ืงืื ื, ืืืขื 3 ืืืืืื ืจืฉืืืืช.
ืืืืื ืื ืขืืงืืช ืืืจ ืกืจืืงื ืืืื.
Hash Cond: ((w."SPENT_ID" = s."SPENT_ID") AND ((SubPlan 1) = s"SPENT_DATE"))
-> ืกืจืืงืช Seq ืขื wdata w (ืขืืืช=0.00..574151.49 rows=26886249 width=46) (ืืื ืืคืืขื=0.005..8153.565 rows=26873950 ืืืืืืช=1)
ืื ืื ื ืขืืฉืื ืืช ืืืืจ ืืกืื ืืจืื: "ืืืืื, ืืืื ื ืขืฉื ืืื ืืงืก ืืืื ืืขืืฃ".
ืืฆืจ ืืื ืืงืก ืืฉืื "SPENT_ID".
ืืชืืฆืื ืืื:
ืชืืื ืืช ืืืฆืืข ืฉืืืืชื ืืืืฆืขืืช ืืื ืืงืก
ืืืื, ืื ืขืืจ?
ืื ืืื: 8 222 351.640 MS (ืงืฆืช ืืืชืจ ืืฉืขืชืืื)
ืื ืืคื: 6 985 431.575 ืืืคืืืช ืืฉื ืืื (ืืืขื ืฉืขืชืืื)
ืืืืคื ืืืื, ืืืชื ืชืคืืืื, ืืื ืืืฆื.
ืืืื ื ืืืืจ ืืช ืืงืืืกืืงื:
"ืืฉ ืื ืืืชื ืืื, ืืื ืืื ืื ืคืืื? ืืืคืฉ".
ืืืืคื ืขืงืจืื ื, ืืคืฉืจ ืืงืจืื ืืื ืชืืฆืื ืืืื, ืืืื, ืื ืืืื, ืืื ืืงืืืืช. ืืื ืืคืืืช, ืกืคืง ืืื ืืืื ืืืงืื ืืืชืืจ ืืื ื ืขืฉื ืืืื ืื ืฉื ืขืฉื ืืื ืืื.
ืืื ืขืืืื, ืืืืืื ืืกืืคืืช ืขืืืื ืจืืืงื. ืจืืืง ืืืื.
ืืขืืฉืื ืืืืจ ืืื ืืขื ืืื - ืื ืื ื ืืืฉืืืื ืืืืขื, ื ืืืฉ ืืช ืืืงืฉื
ืฉืื ืจืืฉืื - ืืฉืชืืฉ ื-JOIN
ืืืงืฉื ืืืฉืืืชืืช ื ืจืืืช ืืขืช ืื (ืืื ืืคืืืช ืืืชืจ ืืคื):
ืฉืืืืชื ืืืืฆืขืืช JOINืืืืืจ
p.โPARAMETER_IDโ ืืชืืจ parameter_id,
pd."PD_NAME" AS pd_name,
pd."CUSTOMER_PARTNUMBER" AS customer_partnumber,
w. "LRM" AS LRM,
w. "LOTID" AS lotid,
w.โRTD_VALUEโ AS RTD_value,
w.โLOWER_SPEC_LIMITโ AS lower_spec_limit,
w.โUPPER_SPEC_LIMITโ AS upper_spec_limit,
p."TYPE_CALCUL" AS type_calcul,
s."SPENT_NAME" AS spend_name,
s.โSPENT_DATEโ AS spent_date,
extract(year from "SPENT_DATE") AS year,
extract(month from "SPENT_DATE") ืืืืืฉ,
s."REPORT_NAME" AS report_name,
p."STPM_NAME" AS stpm_name,
p.โCUSTOMERPARAM_NAMEโ AS customerparam_name
FROM wdata w INNER JOIN ืืืื s ON w.โSPENT_IDโ=s.โโSPENT_IDโ
INNER JOIN pmtr p ON p.โPARAMETER_IDโ = w.โPARAMETER_IDโ
INNER JOIN spent_pd sp ON s.โSPENT_IDโ = sp.โSPENT_IDโ
INNER JOIN pd pd ON pd.โPD_IDโ = sp.โPD_IDโ
ืืืคื
s.โSPENT_DATEโ >= '2018-07-01' ื-s.โSPENT_DATEโ <= '2018-09-30'AND
s.โSPENT_DATEโ = (ืืืจ MAX(s2.โSPENT_DATEโ)
FROM wdata w2 INNER JOIN ืืืฆื s2 ON w2.โSPENT_IDโ=s2.โSPENT_IDโ
INNER JOIN wdata w
ON w2.โLRMโ = w.โLRMโ );
ืืื ืชืื ืื: 2.486 ืืืคืืืช ืืฉื ืืื
ืืื ืืืฆืืข: 1223680.326 ms
ืื, ืืชืืฆืื ืืจืืฉืื ื.
ืื ืืื: 6 ืืืคืืืช ืืฉื ืืื (ืืืขื ืฉืขืชืืื).
ืื ืืคื: 1 223 680.326 ืืืคืืืช ืืฉื ืืื (ืืขื ืืืชืจ ื-20 ืืงืืช).
ืชืืฆืื ืืืื. ืืืืคื ืขืงืจืื ื, ืฉืื, ื ืืื ืืขืฆืืจ ืฉื. ืืื ืื ืื ืื ืื ืืขื ืืื, ืื ืืคืฉืจ ืืืคืกืืง.
ื
ืฉืื ืฉื ื - ืืืคืืจ ืืฉืืืืช ืืืฉื ื ืืืชืืืืช
ืืงืกื ืืงืฉื ืฉืื ื:
ืืื ืฉืืืืชืช ืืฉื ื ืืงืืจืืฆืืืืืืืจ
p.โPARAMETER_IDโ ืืชืืจ parameter_id,
pd."PD_NAME" AS pd_name,
pd."CUSTOMER_PARTNUMBER" AS customer_partnumber,
w. "LRM" AS LRM,
w. "LOTID" AS lotid,
w.โRTD_VALUEโ AS RTD_value,
w.โLOWER_SPEC_LIMITโ AS lower_spec_limit,
w.โUPPER_SPEC_LIMITโ AS upper_spec_limit,
p."TYPE_CALCUL" AS type_calcul,
s."SPENT_NAME" AS spend_name,
s.โSPENT_DATEโ AS spent_date,
extract(year from "SPENT_DATE") AS year,
extract(month from "SPENT_DATE") ืืืืืฉ,
s."REPORT_NAME" AS report_name,
p."STPM_NAME" AS stpm_name,
p.โCUSTOMERPARAM_NAMEโ AS customerparam_name
FROM wdata w INNER JOIN ืืืื s ON s.โSPENT_IDโ = w.โSPENT_IDโ
INNER JOIN pmtr p ON p.โPARAMETER_IDโ = w.โPARAMETER_IDโ
INNER JOIN spent_pd sp ON s.โSPENT_IDโ = sp.โSPENT_IDโ
INNER JOIN pd pd ON pd.โPD_IDโ = sp.โPD_IDโ
INNER JOIN (ืืืจ w2.โLRMโ, MAX(s2.โSPENT_DATEโ)
FROM ืืืื s2 INNER JOIN wdata w2 ON s2.โSPENT_IDโ = w2.โSPENT_IDโ
GROUP BY w2."LRM"
) md on w.โLRMโ = md.โLRMโ
ืืืคื
s."SPENT_DATE" >= '2018-07-01' ื-s"SPENT_DATE" <= '2018-09-30';
ืืื ืชืื ืื: 2.291 ืืืคืืืช ืืฉื ืืื
ืืื ืืืฆืืข: 165021.870 ms
ืื ืืื: 1 223 680.326 ืืืคืืืช ืืฉื ืืื (ืืขื ืืืชืจ ื-20 ืืงืืช).
ืื ืืคื: 165 021.870 ms (ืืขื ืืืชืจ ื-2 ืืงืืช).
ืื ืืืจ ืื ืืื.
ืขื ืืืช, ืืื ืฉืืืืจืื ืืืจืืืื "ืืื, ืชืืื ืืฉ ืืื" ืชืืฆืื ืืืื ืืื ืืืืจื ืืขืืจืจ ืืืืคื ืืืืืืื ืืฉื. ืืฉืื ืื ืืกืืจ ืืื.
ืืืฉืขืจื ืืืื ืชืืงืื ืืฉืืืืชื ืืื ืืืืคืืจ ืืชืช ืฉืืืืชืช ืืืชืื ื ืืื ื. ืืื ืืชื ืฆืจืื ืืฆืืื ืืืชื ืืขื ืืื ืฉืืชืืฆืื ืืกืืคืืช ืชืืื ื ืืื ื.
ืืชืืฆืื ืืื, ืชืืฆืืช ืืืื ืืื ืืจืืฉืื ื:
ืฉืืืืชื ืขืจืืื ืืื ืฉืืืืชืช ืืฉื ื ืืืชืืืืืืืืจ
p.โPARAMETER_IDโ ืืชืืจ parameter_id,
pd."PD_NAME" AS pd_name,
pd."CUSTOMER_PARTNUMBER" AS customer_partnumber,
w. "LRM" AS LRM,
w. "LOTID" AS lotid,
w.โRTD_VALUEโ AS RTD_value,
w.โLOWER_SPEC_LIMITโ AS lower_spec_limit,
w.โUPPER_SPEC_LIMITโ AS upper_spec_limit,
p."TYPE_CALCUL" AS type_calcul,
s."SPENT_NAME" AS spend_name,
s.โSPENT_DATEโ AS spent_date,
extract(year from s.โSPENT_DATEโ) AS year,
ืืืฅ (ืืืืฉ ืืชืืจืื s.โSPENT_DATEโ) ืืืืืฉ,
s."REPORT_NAME" AS report_name,
p."STPM_NAME" AS stpm_name,
p.โCUSTOMERPARAM_NAMEโ AS customerparam_name
FROM wdata w INNER JOIN ืืืื s ON s.โSPENT_IDโ = w.โSPENT_IDโ
INNER JOIN pmtr p ON p.โPARAMETER_IDโ = w.โPARAMETER_IDโ
INNER JOIN spent_pd sp ON s.โSPENT_IDโ = sp.โSPENT_IDโ
INNER JOIN pd pd ON pd.โPD_IDโ = sp.โPD_IDโ
INNER JOIN (ืืืจ w2.โLRMโ, MAX(s2.โSPENT_DATEโ) ื-โSPENT_DATEโ
FROM ืืืื s2 INNER JOIN wdata w2 ON s2.โSPENT_IDโ = w2.โSPENT_IDโ
GROUP BY w2."LRM"
) md ON md.โSPENT_DATEโ = s.โSPENT_DATEโ ื-md.โLRMโ = w.โLRMโ
ืืืคื
s."SPENT_DATE" >= '2018-07-01' ื-s"SPENT_DATE" <= '2018-09-30';
ืืื ืชืื ืื: 3.192 ืืืคืืืช ืืฉื ืืื
ืืื ืืืฆืืข: 208014.134 ms
ืื ืื ืฉืื ืื ื ืืงืืืื ืืื ืืชืืฆืื ืืืงืืืืช ืืจืืฉืื ื, ืฉืื ืืื ืืืจืืืช ืืืงืื:
ืืชืืื ืขื: 8 222 351.640 ืืืคืืืช ืืฉื ืืื (ืืืชืจ ืืฉืขืชืืื)
ืืฆืืื ื ืืืฉืื: 1 ืืืคืืืช ืืฉื ืืื (ืงืฆืช ืืืชืจ ื-223 ืืงืืช).
ืชืืฆืื (ืืื ืืื): 208 014.134 ms (ืืขื ืืืชืจ ื-3 ืืงืืช).
ืชืืฆืื ืืขืืื.
ืกื ืืื
ืืืืื ื ืืขืฆืืจ ืฉื.
ืืืโฆ
ืืชืืืืื ืื ืขื ืืืืืื. ืืืืื ืืฉืืื ืืืจื. ืื ืชืืฆืื ืืื ืืื ืื ืืช. ื ืขืฆืจ ืืืช. ืืื.
ืืืื ื ืืฉืื ืืืืคืืืืืืฆืื.
ืจืขืืื ืืฆืืื. ืืืืืื ืืืชืืฉื ืืื ืฉืืืงืื ืืคืืื ืื ืืื ืืืคืช. ืืืคืืื ืืืง ืขื ืื.
ืื ืืืืข ืืืื ืืขืืฆืื ืืืืฉ ืฉื ืืกื ืื ืชืื ืื. ืื ื ืืชื ืขืื ืืืฆืข ืืืคืืืืืืฆืื ืฉื ืืื ื ืืฉืืืืชื ืขืฆืื (ืื ืื, ืืคื ืฉืืชืืจืจ ืืืืืจ ืืืชืจ, ืืฉื ื ืืคืฉืจืืช ืืืืืื ืฉืืื ืืื ืืืืฉื). ืืื ืืืชืืื ืืืืขื ืืืคืชื ืืช ืขืืฆืื ืืกื ืื ืชืื ืื ืื ืืืจ ืจืขืืื ืืืื ืืืืื. ืืืื ืืฉืื ืืขื ืืื. ืฉืื, ืืืืจ ืืช ื ืขืืจืื. ืืจื ืื ืืื ืืคืืชื ื-DBA, ืืืืชื ืืืชืื ืช (BASIC, assembler, C, double-plus C, Oracle, plsql). ื ืืฉื ืืขื ืืื, ืืืืื, ืืกืคืจ ืืืืจืื ืืช ื ืคืจื ;-).
ืขื ืืืช, ืืืื ืื ื ืกืื ืืช ืืขืชื ื.
ืืคืืื,
ืื ืฉืืืื ืืืืงื ืชืขืืืจ ืื ื?
ืกืคืืืืจ - "ืื, ืื ืขืืจ, ืืืื ืืืืคืืืืืืฆืื ืฉื ืืืฆืืขืื."
ืืื ืื ืกืืคืืจ ืืืจ ืืืืจื...
ืืืฉื ืืืืโฆ
ืืงืืจ: www.habr.com