α’αααΈααααααααααα»αααααΌααααααΎαααααα·αααααΆααααα½α PostgreSQL αα·αα’αααΈαααα
ααααΈααΆααΆααα’ααα
α ααα»α’αααΈααΆαααΆα’αααααααΌα? αααα αΎα αααααααΆαααΈ α€ ααααΆααα»α α’αααΈαααααΎαααΆααααΆααααααααααΆαα αααααααααΆαα ααΌα
ααΆααΆα‘α·ααΆαααΆααα
ααΆ epigraph αα½αα
ααα’ααααΎααααΉαααα·ααΆααααα·αα
αααααααΆααα’ααααααΌαααΆαααααΆααααααΌα ααΆαα
αααααααΊα
αααααα
αα αααα’ααααααααα ααΆαααααααααΆααααΆαααα½α ααΆααααααα½αα±ααα αΆααα’αΆαααααααααα»αααΆαα αα αΆαααΌαα’αααΈαααααΆαααααΆαααα»αα αααΆααααααΆααααΆαα αΆααααααΎα αααααΆααΆααα’ααααΆαα αΆααααααΎαα
ααΌα
αααα α’αααΈβαααβααΆαβααΎαβα‘αΎαβααΆβααααααβααααΌαβααΆαβαα·αααααΆβαααΆαβααααΈβαα
βαααα»αβα’ααααα "
ααΆαααα ααααΆαα½αα±ααα
αΆααα’αΆαααααααααα»αααΆααααααΎααααααααααΆααααααααΉαααα·ααΆααααα»ααα‘αΎααα·αα
αααααααα·ααΆααααααΆαα»αααΆαααα·α
ααααα
αΆααααααΎααα·αααααΆαα - 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" ααΌα
ααΆ 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 α
αααΆα_ααααα,
s.βSPENT_DATEβ AS ααΆαααα·α
ααααα
αααΆα,
αααααα
αα(ααααΆαααΈ "SPENT_DATE") AS ααααΆα,
αααααα
αα(ααααΈ "SPENT_DATE") ααΆαα
s."REPORT_NAME" AS report_name,
p."STPM_NAME" AS stpm_name,
p.βCUSTOMERPARAM_NAMEβ AS customerparam_name
ααΈ wdata w,
ααΆαα
αααΆα s,
pmtr αα,
α
αααΆα_pd sp,
pd pd
WHERE s.βSPENT_IDβ = w.βSPENT_IDβ
AND p."PARAMETER_ID" = w.PARAMETER_ID"
AND s.βSPENT_IDβ = sp.βSPENT_IDβ
AND pd."PD_ID" = sp.PD_ID"
αα·α s.βSPENT_DATEβ >= '2018-07-01' αα·α s.βSPENT_DATEβ <= '2018-09-30'
αα·α s.βSPENT_DATEβ = (SELECT MAX(s2.βSPENT_DATEβ)
ααΈα
αααΆα s2,
wdata w2
WHERE s2.βSPENT_IDβ = w2.βSPENT_IDβ
αα·α w2.βLRMβ = w.βLRMβ);
ααΆααα·αααααΆα’αααΈαααα αΆααΊααΆαααααααΆαααααΆαααα - "α’αααΈααααααααΆαααΊα’αΆαααααα ααααΆααβαααα»αβααΆβααΆαβαααα αΆβα’αααΈΒ»α
αααα»αβααΉαβααΎαβααΏαβααααΈβαα½αβααααΆαβαβααΈβααβααβααΆαβααΎαααβα£βα’ααΈαβαααααα
αααα·αααΌα
ααααα’ααααα½α
α
αΌαα
- ααααΆαα’αααΈααα’αααααΆαααααα»ααα ααααΆαααααα»αααΈααααααααααααα αΆα
- αα
αααα»α DNA...
ααα»ααααααΆααΆααα·α ααααα·ααααααΆαα·ααΈααΎααααΈαααααααΆαα§ααααααα·α ααα»ααααΆαα’αα»αααααααααα βαα½ααααααα ααααΆαα·ααααααΈααΎαααα" (ααΆαα½α) α ααΎαααααΌααααααααΆαααΆα
α
αΌαααΎαααΈαα αααα ααααΆα’αααΈαα½αααΉααααα»αααΆααααααα
ααΆααααΎαα’αααααααΆαα αΆααααααΎα
ααΌα
αααα α’αααΈβαααβα’αΆα
βααΎαβααΎαβααααΆααβαααβαααααβααα αααβαα·αβααΆα
αβααααΎβααΆαααβααααααα
1) JOINs αα·αααααΌαααΆαααααΎααα αααααΊα’αΆαααααααΆαα·αααααααα·αααΎα
ααα½αααααΆααααααΆααααΆαα
αααΎαααΆααα½αα
2) ααα»ααααα’αααΈαααααΆααααα’αΆααααααααααΊ αααα½ααααααααΆααααααααΆ ααΎαααΈααααα
αααααΆαα½αααΉαααΆααααααΌααααα»αα αααααΊα’αΆαααααααΆααα
ααααα·αααΆα’αΆαααααααΆααα ααα»αααααααααααΆαααααα
ααΎααααααΆαααα»αααααα αααααΆααα·αααα αααααΊααα’ααΆαα ααααααααα αΆα
αααΆααααΆααΆααααααααααΆα αα·αααααΌααααααα’αΆα
αααααα’ααΆαα
αα»ααα
αα½αααααΌααΆα (C)α
αααααΆαβαααα½αβαα·αβαααα»αααααΆαβαααβαα ααα»ααααβααΆβαααα αΆαβαααΆαβα
αααΆααα
αααααΆαααααα·ααααα·
αα½αα±ααα
αΆααα’αΆαααααααα·αααΆααααααααααααα»αααΌα
ααααααΆααΊαα
ααΎααα·αα
α»ααααα
ααα
Nested Loop (ααααα=935.84..479763226.18 rows=3322 width=135) (αααααααΆαα·α=31.536..8220420.295 rows=8111656 loops=1)
αααααααΆααααΎαααααΆαα 3.807 ms
αααααααΆααααα·ααααα·α 8222351.640 ms
αααααααΆαααα
ααααΊα
αααΎαααΆα 2 ααααα
αααααα·αααααα·ααα·ααααααΆαα αααΆαααα
αααααα·αααα 1 - α’ααααααααΎαααααα·αααααΆαααααΎαα»α α αΎααααααΎααααααΆααα»αα
ααΎααααΈααΎαααΎααααααΆαααααα·ααααα· ααΎαααΉαααααΎααα ααααα
αααααα·αααα 2- αααααααΆααααΎααΌαααααΆαααΈα αα αα autovacuum α’αααααααΌααααα αΆααα αααααΆααα
ααα»αααααααα·α autovacuum ααΆαα₯αα·ααΆααααα’ αα·αααΆαααααΎαααΆααααα½αααΌαααα αα·αααΆαααααα»ααααααααααααα ααΎαααααΌαααααΎαα’αααΈααααααααα
αααααα·ααααααΈ 3 - αααα·αα·α α½ααααα α’αααΈαααααΌαααααΆα‘αΎααα·α
ααααααα αα·ααααα’ααα αΉαααα αααα·αα·ααΊααΆααααααα ααααααααα±ααααααααααααα αΆααΆαα½α autovacuum ααΊαα·ααα½αα±ααααααΆααααα’αΎααααααα
α αΌαα αΆααααααΎαααααΎα±αααααααΎα
ααΆααΆαααααΆαα 'wdata' αα·αααΆαα·αααΌα
αα ααααΎααα 3 ααΆααααααααααΆα
α αΎαααΆααΊααΆααΆααΆααααααα Full Scan ααααΎααΆαα
Hash Condα ((w.SPENT_ID" = s."SPENT_ID") AND ((SubPlan 1) = s."SPENT_DATE"))
-> ααααα Seq αα
ααΎ wdata w (cost=0.00..574151.49 rows=26886249 width=46) (αααααααΆαα·α=0.005..8153.565 rows=26873950 loops=1)
ααΎαβααααΎβααΆαβαααααααΆαα "αα ααΎαβαααααΎαβαα·αα·αααα α αΎαβα’αααΈαβααΉαβα ααβα αΎα"α
ααΆααααααΎααα·αα·αααααα
ααΎααΆα βSPENT_IDβ
ααΆβαααααα:
αααααΆαααααα·ααααα·αααα½ααααααααΎαα·αα·αααα
αααα αΎα ααΎααΆααΆααα½ααα?
ααΊα 8 222 351.640 ms (α
αααΎαααΆα 2 ααααααααα·α
)
ααΆαααααΆαααΆα 6 985 431.575 ms (αα·α 2 αααα)
ααΆααΌαα
ααααααααααΌα
ααααΆ αα·αααααΆαα
αα ααα
αααα
αα
αΆαααΏααα»ααΆαα
βααΎβα’αααβααΆαβααΌα
βααααΆ ααα»ααααβααααΆαβααααΆα? ααΉαααααααα"α
ααΆαααααΆααα αααα’αΆα
ααααΌαααΆαααα α
ααΆααΆααααααααα’ ααα’ αα·αααα’ ααα»ααααα’αΆα
ααα½αααααΆαα αααΆαα αα
ααΆαα ααααααααΆαααΆααααααα½ααααα’αα·αα·αα ααααα·αααααΆα’αααΈα
ααα½ααααααΆαααααΎ α αΎαα ααα»α’αααΈααΆαααΆα’αααΈαααααΆαααααΎααΊααα’α
ααα»αααααα
ααααΆααααααα
α
α·αααα
α»αααααααα
ααααααΆαα ααααΆαααΆααα
α αΎαα₯α‘αΌααααα’αααΈααααα½αα±ααα αΆααα’αΆαααααααααα»α - ααΎααααααααααΎαααααα·αααααΆαααΎαααΉαααααΎα±ααααααΎ
ααα αΆαααΈαα½α - ααααΎ 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" ααΌα
ααΆ 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 α
αααΆα_ααααα,
s.βSPENT_DATEβ AS ααΆαααα·α
ααααα
αααΆα,
αααααα
αα(ααααΆαααΈ "SPENT_DATE") AS ααααΆα,
αααααα
αα(ααααΈ "SPENT_DATE") ααΆαα
s."REPORT_NAME" AS report_name,
p."STPM_NAME" AS stpm_name,
p.βCUSTOMERPARAM_NAMEβ AS customerparam_name
ααΈ wdata w INNER JOIN ααΆαα
αααΆαααΎ w.βSPENT_IDβ=sββSPENT_IDβ
Inner JOIN pmtr p ON p.βPARAMETER_IDβ = w.βPARAMETER_IDβ
INNER JOIN α
αααΆα_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β = (SELECT MAX(s2.βSPENT_DATEβ)
ααΈ wdata w2 INNER JOIN ααΆαα
αααΆα s2 ON w2.βSPENT_IDβ=s2.βSPENT_IDβ
ααΆααααα»αα
αΌααα½α wdata w
ααΎα w2.βLRMβ = w.βLRMβ );
αααααααΆααααΎαααααΆαα 2.486 ms
αααααααΆααααα·ααααα·α 1223680.326 ms
ααΌα
ααααααααααααααΌαα
ααΊα 6 ms (αα·α 985 αααα) α
ααΆαααααΆαααΆα 1 223 680.326 ms (ααααΆααααααΆα 20 ααΆααΈ) α
ααααααααα’α ααΆαααααΆααα ααΆααααΈααααααα ααΎαα’αΆα
ααααα
ααΈαααα ααα»ααααααΆαα½αα±ααα
αΆααα’αΆααααααααΆαα α’ααααα·αα’αΆα
ααααααααΆαααα
αααααΆαα
ααα αΆαααΈααΈα - αααα αΆαααααα½ααααααααΆαααα
ααΆαααααΆααααααΌαα’αααααααααΎα
αααααααΆααααα½ααααααααΆααααααααΎαααΎα
p.βPARAMETER_IDβ ααΆ parameter_id,
pd."PD_NAME" AS pd_name,
pd."CUSTOMER_PARTNUMBER" AS customer_partnumber,
w.LRM" AS LRM,
w. "LOTID" ααΌα
ααΆ 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 α
αααΆα_ααααα,
s.βSPENT_DATEβ AS ααΆαααα·α
ααααα
αααΆα,
αααααα
αα(ααααΆαααΈ "SPENT_DATE") AS ααααΆα,
αααααα
αα(ααααΈ "SPENT_DATE") ααΆαα
s."REPORT_NAME" AS report_name,
p."STPM_NAME" AS stpm_name,
p.βCUSTOMERPARAM_NAMEβ AS customerparam_name
ααΈ wdata w. INNER JOIN ααΆαα
αααΆαααΎ s.βSPENT_IDβ = w.βSPENT_IDβ
Inner JOIN pmtr p ON p.βPARAMETER_IDβ = w.βPARAMETER_IDβ
INNER JOIN α
αααΆα_pd sp ON s.βSPENT_IDβ = sp.βSPENT_IDβ
INNER JOIN pd pd ON pd.βPD_IDβ = sp.βPD_IDβ
ααΆαα
αΌααα½αααΆααααα»α (ααααΎαααΎα w2.βLRMβ, MAX(s2.βSPENT_DATEβ)
ααΈααΆαα
αααΆα s2 ααΆααααα»αα
αΌααα½α wdata w2 ON s2.βSPENT_IDβ = w2.βSPENT_IDβ
αααα»αααα w2.βLRMβ
) md αα
ααΎ w.βLRMβ = md.βLRMβ
ααΈαααααα
s."SPENT_DATE" >= '2018-07-01' AND s."SPENT_DATE" <= '2018-09-30';
αααααααΆααααΎαααααΆαα 2.291 ms
αααααααΆααααα·ααααα·α 165021.870 ms
ααΊα 1 223 680.326 ms (ααααΆααααααΆα 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" ααΌα
ααΆ 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 α
αααΆα_ααααα,
s.βSPENT_DATEβ AS ααΆαααα·α
ααααα
αααΆα,
αααααα
αα(ααααΆαααΈ s.βSPENT_DATEβ) ααΆααααΆα,
αααααα
αα(ααααΈ s.βSPENT_DATEβ) ααΆαα
s."REPORT_NAME" AS report_name,
p."STPM_NAME" AS stpm_name,
p.βCUSTOMERPARAM_NAMEβ AS customerparam_name
ααΈ wdata w. INNER JOIN ααΆαα
αααΆαααΎ s.βSPENT_IDβ = w.βSPENT_IDβ
Inner JOIN pmtr p ON p.βPARAMETER_IDβ = w.βPARAMETER_IDβ
INNER JOIN α
αααΆα_pd sp ON s.βSPENT_IDβ = sp.βSPENT_IDβ
INNER JOIN pd pd ON pd.βPD_IDβ = sp.βPD_IDβ
ααΆαα
αΌααα½αααΆααααα»α ( SELECT w2.βLRMβ, MAX(s2.βSPENT_DATEβ) ααΆ βSPENT_DATEβ
ααΈααΆαα
αααΆα s2 ααΆααααα»αα
αΌααα½α wdata w2 ON s2.βSPENT_IDβ = w2.βSPENT_IDβ
αααα»αααα w2.βLRMβ
) md ON md.βSPENT_DATEβ = s.βSPENT_DATEβ αα·α md.βLRMβ = w.βLRMβ
ααΈαααααα
s."SPENT_DATE" >= '2018-07-01' AND s."SPENT_DATE" <= '2018-09-30';
αααααααΆααααΎαααααΆαα 3.192 ms
αααααααΆααααα·ααααα·α 208014.134 ms
ααΌα
αααα α’αααΈβαααβααΎαβαααα
ααβααΊβααααααβααααΌαβαααβα’αΆα
βααα½αβααβααΆα αααβαα·αβαααβααΆβααΆαβα’ααβααααΆαβαααα»αβααΆαβαααα αΆαβαααβα’αα·αα·ααβα‘αΎαα
α
αΆααααααΎαααΆαα½αα 8 222 351.640 ms (α
αααΎαααΆα 2 αααα)
ααΎαα’αΆα
αααααα
ααΆαα 1 ms (α
αααΎαααΆα 223 ααΆααΈ)α
αααααα (ααααααα’αΆαααα)α 208 014.134 ms (ααααΆααααααΆα 3 ααΆααΈ) α
ααααααααα’ααα
αΆαααα
αααααα
ααΎαα’αΆα
ααααα
ααΈαααα
ααα»ααααβ¦
α
ααααα’αΆα αΆαααΎαα‘αΎαααΆαα½αααΉαααΆααααΆαα α’αααβαααβααΎαβααΉαβααααΎβααΆβααα
αΆααβααααΌαα ααααααααΆαα½αααΊααααα·ααααααα αααα αΎαααααΆααα αα
αααααααααΆααααααΎαααααα·αααααΆαα
αααα·αααα’ααα
αΆαααα ααΆαα·αααβαα·αβααΆβα’αα·αα·ααβαα·αβααΆαβαα·αβα’αααΈβααΆααα’ααβα α αΎαααΌααααΈααααααΆαααααααΆααααΆα
ααΌα
αααα ααΆααααααα αΎααααααΆααααΆααα
ααΆααΌαααααΆααα·ααααααα‘αΎααα·αα αα
ααΆαααααααααα½ααααα½αα―ααα·αα’αΆα
ααααΎα±αααααααΎαα‘αΎαααΆαααααα (αααααΈααΆααΆααΆαααααααααΆααα
ααααααααααααα ααΆααααααΎαααΎααααΈααΆααΆααΆα’αααΈαααΆααα’αααα·αααΆαααΆααα)α ααα»ααααααΎααααΈα
αΆααααααΎααααααΎαααααα·αααααΆα αα·αα’αα·ααααααΆααα
ααΆααΌαααααΆααα·ααααααααΊααΆαααα·ααααααααααα½α
αα
α αΎαα α αΎαααααΆαααααα»ααα½αα±ααα
αΆααα’αΆααααααα ααΆααααΈααααααα α
αα
αΆααα»ααααααααα’αααα αααΆαααΆαα·α αααα»ααα·αααΆαααααΆαααΆ DBA ααααΆααααααα αααα»αααα‘αΎαααΆα’αααααααααααααα·ααΈ (BASIC, assembler, C, double-plus C, Oracle, plsql)α αααααΆααααα½αα±ααα
αΆααα’αΆαααααα αα·αααΆαααααααΆααααΆαα
αα
αΆαααΆα
ααααα‘αααα½α ;-) α
αααβααΆβαααΆαβααΆ ααΌαβαα»αβα²ααβααΆαβααΆαβααααΆαα
α αΎαααΌα αααα,
α¬αααα ααααΆααΆααααα
ααααΉααα½αααΎα?
Spoiler - "ααΆα ααΆααΆααα½α αα½αααΆααααΆααααααΎαααααα·αααααΆαααααα·ααααα·ααΆαα"
ααα»ααααααΆααΆααΏααα»αααααΆααΆαααααα»α...
αα
βααΆαβααΆβααααβαααβ¦
ααααα: www.habr.com