เดธเดจเตเดคเต‹เดทเด•เดฐเดฎเดพเดฏ เดชเดพเตผเดŸเตเดŸเดฟ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ PostgreSQL10-เตฝ เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เด…เดฑเดฟเดฏเตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด“เตผเดฎเตเดฎเด•เดณเตเดŸเต† เดฐเดฃเตเดŸเต เดตเดฐเดฟเด•เตพ

เด†เดฎเตเด–เด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดตเดฟเดญเดœเดจเด‚ เดŽเดจเตเดจ เด†เดถเดฏเด‚ เดŽเด™เตเด™เดจเต† เด‰เดฃเตเดŸเดพเดฏเดฟ

เด•เดฅ เด‡เดตเดฟเดŸเต† เดคเตเดŸเด™เตเด™เตเดจเตเดจเต: เด‡เดคเต†เดฒเตเดฒเดพเด‚ เดŽเด™เตเด™เดจเต† เด†เดฐเด‚เดญเดฟเดšเตเดšเตเดตเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด“เตผเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต‹? เดŽเดฒเตเดฒเดพเด‚ เด†เดฆเตเดฏเดฎเดพเดฏเดฟ เดตเต€เดฃเตเดŸเตเด‚ เดตเต€เดฃเตเดŸเตเด‚. เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดŽเดฒเตเดฒเดพ เดตเดฟเดญเดตเด™เตเด™เดณเตเด‚, เด† เดธเดฎเดฏเดคเตเดคเต, เดคเต€เตผเดจเตเดจเตเดชเต‹เดฏเดชเตเดชเต‹เตพ, เดšเต‹เดฆเตเดฏเด‚ เด‰เดฏเตผเดจเตเดจเต - เด…เดŸเตเดคเตเดคเดคเต เดŽเดจเตเดคเดพเดฃเต? เด…เด™เตเด™เดจเต†เดฏเดพเดฃเต เดตเดฟเดญเดœเดจเด‚ เดŽเดจเตเดจ เด†เดถเดฏเด‚ เด‰เดŸเดฒเต†เดŸเตเดคเตเดคเดคเต.

เดธเดจเตเดคเต‹เดทเด•เดฐเดฎเดพเดฏ เดชเดพเตผเดŸเตเดŸเดฟ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ PostgreSQL10-เตฝ เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เด…เดฑเดฟเดฏเตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด“เตผเดฎเตเดฎเด•เดณเตเดŸเต† เดฐเดฃเตเดŸเต เดตเดฐเดฟเด•เตพ

เดฒเดฟเดฑเดฟเด•เตเด•เตฝ เดกเตˆเด—เตเดฐเดทเตป:
เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เดชเดฑเดžเตเดžเดพเตฝ 'เด† เดจเดฟเดฎเดฟเดทเดคเตเดคเดฟเตฝ', เด•เดพเดฐเดฃเด‚ เด…เดคเต เดฎเดพเดฑเดฟเดฏเดคเต เดชเต‹เดฒเต†, เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดคเตเดค เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต‡เดทเตป เด•เดฐเตเดคเตฝ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต... เดจเดจเตเดฆเดฟ asmm เด’เดชเตเดชเด‚ เดนเดฌเตเดฐเต!

เด…เดคเดฟเดจเดพเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเด™เตเด™เดจเต† เด‰เดชเดญเต‹เด•เตเดคเดพเดตเดฟเดจเต† เดธเดจเตเดคเต‹เดทเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเดพเด•เตเด‚, เด…เดคเต‡ เดธเดฎเดฏเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เด•เดดเดฟเดตเตเด•เตพ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดพเด‚?

เดŽเดฒเตเดฒเดพเด‚ เด•เดดเดฟเดฏเตเดจเตเดจเดคเตเดฐ เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เดพเตปเดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดจเตเดฑเต† เดชเตเดฐเด•เดŸเดจเดคเตเดคเดฟเตฝ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดธเดฎเต‚เดฒเดฎเดพเดฏเดฟ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เดฐเดฃเตเดŸเต เดตเดดเดฟเด•เดณเต‡เดฏเตเดณเตเดณเต‚:
1) เดตเดฟเดชเตเดฒเดฎเดพเดฏ เดชเดพเดค - เดžเด™เตเด™เตพ เดตเดฟเดญเดตเด™เตเด™เตพ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดฎเดพเดฑเตเดฑเตเดจเตเดจเต;
2) เดคเต€เดตเตเดฐเดฎเดพเดฏ เดชเดพเดค - เด…เดจเตเดตเต‡เดทเดฃ เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต‡เดทเตป

เดตเต‡เด—เดคเตเดคเดฟเดฒเดพเด•เตเด•เดพเดจเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดฟเตฝ เดฎเดฑเตเดฑเต†เดจเตเดคเดพเดฃเต เดฎเดพเดฑเตเดฑเต‡เดฃเตเดŸเดคเต†เดจเตเดจเต เด…เด•เตเด•เดพเดฒเดคเตเดคเต เดตเตเดฏเด•เตเดคเดฎเดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเตฝ, เดžเดพเตป เด†เดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เดชเดพเดค เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเต - เดŸเต‡เดฌเดฟเตพ เดกเดฟเดธเตˆเตป เดฎเดพเดฑเตเดฑเด™เตเด™เตพ.

เด…เดคเดฟเดจเดพเตฝ, เดชเตเดฐเดงเดพเดจ เดšเต‹เดฆเตเดฏเด‚ เด‰เดฏเตผเดจเตเดจเตเดตเดฐเตเดจเตเดจเต: เดจเดฎเตเดฎเตพ เดŽเดจเตเดคเต, เดŽเด™เตเด™เดจเต† เดฎเดพเดฑเตเด‚?

เดชเตเดฐเดพเดฐเด‚เดญ เดตเตเดฏเดตเดธเตเดฅเด•เตพ

เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดˆ ERD เด‰เดฃเตเดŸเต (เดธเต‹เดชเดพเดงเดฟเด•เดฎเดพเดฏเดฟ เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เดฟเดฏ เดฐเต€เดคเดฟเดฏเดฟเตฝ เด•เดพเดฃเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต):
เดธเดจเตเดคเต‹เดทเด•เดฐเดฎเดพเดฏ เดชเดพเตผเดŸเตเดŸเดฟ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ PostgreSQL10-เตฝ เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เด…เดฑเดฟเดฏเตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด“เตผเดฎเตเดฎเด•เดณเตเดŸเต† เดฐเดฃเตเดŸเต เดตเดฐเดฟเด•เตพ
เดชเตเดฐเดงเดพเดจ เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ:

  1. เดชเดฒ เดชเดฒ เดฌเดจเตเดงเด™เตเด™เตพ
  2. เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ เด‡เดคเดฟเดจเด•เด‚ เด’เดฐเต เดชเดพเตผเดŸเตเดŸเต€เดทเตป เด•เต€ เด‰เดฃเตเดŸเต

เดฏเดฅเดพเตผเดคเตเดฅ เด…เดญเตเดฏเตผเดคเตเดฅเดจ:

SELECT
            p."PARAMETER_ID" as  parameter_id,
            pc."PC_NAME" AS pc_name,
            pc."CUSTOMER_PARTNUMBER" AS customer_partnumber,
            w."LASERMARK" AS lasermark,
            w."LOTID" AS lotid,
            w."REPORTED_VALUE" AS reported_value,
            w."LOWER_SPEC_LIMIT" AS lower_spec_limit,
            w."UPPER_SPEC_LIMIT" AS upper_spec_limit,
            p."TYPE_CALCUL" AS type_calcul,
            s."SHIPMENT_NAME" AS shipment_name,
            s."SHIPMENT_DATE" AS shipment_date,
            extract(year from s."SHIPMENT_DATE") AS year,
            extract(month from s."SHIPMENT_DATE") as month,
            s."REPORT_NAME" AS report_name,
            p."SPARAM_NAME" AS SPARAM_name,
            p."CUSTOMERPARAM_NAME" AS customerparam_name
        FROM data w INNER JOIN shipment s ON s."SHIPMENT_ID" = w."SHIPMENT_ID"
             INNER JOIN parameters p ON p."PARAMETER_ID" = w."PARAMETER_ID"
             INNER JOIN shipment_pc sp ON s."SHIPMENT_ID" = sp."SHIPMENT_ID"
             INNER JOIN pc pc ON pc."PC_ID" = sp."PC_ID"
             INNER JOIN ( SELECT w2."LASERMARK" , MAX(s2."SHIPMENT_DATE") AS "SHIPMENT_DATE"
                          FROM shipment s2 INNER JOIN data w2 ON s2."SHIPMENT_ID" = w2."SHIPMENT_ID" 
                          GROUP BY w2."LASERMARK"
                         ) md ON md."SHIPMENT_DATE" = s."SHIPMENT_DATE" AND md."LASERMARK" = w."LASERMARK"
        WHERE 
             s."SHIPMENT_DATE" >= '2018-07-01' AND s."SHIPMENT_DATE" <= '2018-09-30' ;

เดŸเต†เดธเตเดฑเตเดฑเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต† เดจเดฟเตผเดตเตเดตเดนเดฃ เดซเดฒเด™เตเด™เตพ:
เดšเต†เดฒเดตเต : 502 997.55
เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเดฎเดฏเด‚: 505 เดธเต†เด•เตเด•เตปเดกเต.

เดจเดฎเตเดฎเตพ เดŽเดจเตเดคเดพเดฃเต เด•เดพเดฃเตเดจเตเดจเดคเต? เด’เดฐเต เดธเดฎเดฏ เดธเตเดฒเตˆเดธเดฟเดจเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด’เดฐเต เดชเดคเดฟเดตเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ.
เดจเดฎเตเด•เตเด•เต เดเดฑเตเดฑเดตเตเด‚ เดฒเดณเดฟเดคเดฎเดพเดฏ เดฒเต‹เดœเดฟเด•เตเด•เตฝ เด…เดจเตเดฎเดพเดจเด‚ เด‰เดฃเตเดŸเดพเด•เตเด•เดพเด‚: เด’เดฐเต เดŸเตˆเด‚ เดธเตเดฒเตˆเดธเดฟเดจเตเดฑเต† เดธเดพเดฎเตเดชเดฟเตพ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด…เดคเต เดžเด™เตเด™เดณเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเดฎเต‹? เด…เดคเต เดถเดฐเดฟเดฏเดพเดฃเต - เดตเดฟเดญเดœเดจเด‚.

เดŽเดจเตเดคเต เดธเต†เด•เตเดทเตป เดšเต†เดฏเตเดฏเดฃเด‚?

เด’เดฑเตเดฑเดจเต‹เดŸเตเดŸเดคเตเดคเดฟเตฝ, เดšเต‹เดฏเตเดธเต เดตเตเดฏเด•เตเดคเดฎเดพเดฃเต - "SHIPMENT_DATE" เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต "เดทเดฟเดชเตเดชเตเดฎเต†เดจเตเดฑเต" เดชเดŸเตเดŸเดฟเด•เดฏเตเดŸเต† เดกเดฟเด•เตเดฒเดฑเต‡เดฑเตเดฑเต€เดตเต เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต (เดตเดณเดฐเต† เดฎเตเดจเตเดจเต‹เดŸเตเดŸเต เด•เตเดคเดฟเด•เตเด•เตเดจเตเดจเต - เด…เดตเดธเดพเดจเด‚ เด…เดคเต เด‰เตฝเดชเดพเดฆเดจเดคเตเดคเดฟเตฝ เด…เตฝเดชเตเดชเด‚ เดคเต†เดฑเตเดฑเดพเดฏเดฟ เดฎเดพเดฑเดฟ).

เดŽเด™เตเด™เดจเต† เดตเดฟเดญเดœเดฟเด•เตเด•เดพเด‚?

เดˆ เดšเต‹เดฆเตเดฏเดตเตเด‚ เดตเดณเดฐเต† เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เด•เดพเดฐเตเดฏเดฎเดฒเตเดฒ. เดญเดพเด—เตเดฏเดตเดถเดพเตฝ, PostgreSQL 10 เตฝ, เด‡เดชเตเดชเต‹เตพ เด’เดฐเต เดนเตเดฏเต‚เดฎเตป เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด‚ เด‰เดฃเตเดŸเต.
เด…เด™เตเด™เดจเต†:

  1. เด‰เดฑเดตเดฟเดŸ เดชเดŸเตเดŸเดฟเด•เดฏเตเดŸเต† เด’เดฐเต เดกเด‚เดชเต เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด• - pg_dump source_table
  2. เดฏเดฅเดพเตผเดคเตเดฅ เดชเดŸเตเดŸเดฟเด• เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด• - เดกเตเดฐเต‹เดชเตเดชเต เดŸเต‡เดฌเดฟเตพ source_table
  3. เดถเตเดฐเต‡เดฃเดฟ เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดชเดพเดฐเดจเตเดฑเต เดŸเต‡เดฌเดฟเตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• - เดชเดŸเตเดŸเดฟเด• source_table เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•
  4. เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• - เดชเดŸเตเดŸเดฟเด• source_table เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•, เดธเต‚เดšเดฟเด• เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•
  5. เด˜เดŸเตเดŸเด‚ 1-เตฝ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดš เดกเด‚เดชเต เด‡เดฑเด•เตเด•เตเดฎเดคเดฟ เดšเต†เดฏเตเดฏเตเด• - pg_restore

เดตเดฟเดญเดœเดจเดคเตเดคเดฟเดจเตเดณเตเดณ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ

เดฒเดพเดณเดฟเดคเตเดฏเดคเตเดคเดฟเดจเตเด‚ เดธเต—เด•เดฐเตเดฏเดคเตเดคเดฟเดจเตเดฎเดพเดฏเดฟ, 2,3,4 เด˜เดŸเตเดŸเด™เตเด™เตพ เด’เดฐเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด…เด™เตเด™เดจเต†:
เด‰เดฑเดตเดฟเดŸ เดชเดŸเตเดŸเดฟเด•เดฏเตเดŸเต† เด’เดฐเต เดกเด‚เดชเต เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด•

pg_dump postgres --file=/dump/shipment.dmp --format=c --table=shipment --verbose > /dump/shipment.log 2>&1

เด‰เดฑเดตเดฟเดŸ เดชเดŸเตเดŸเดฟเด• เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด• + เดฑเต‡เดžเตเดšเต เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดชเดพเดฐเดจเตเดฑเต เดŸเต‡เดฌเดฟเตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด• + เดชเดพเตผเดŸเตเดŸเต€เดทเดจเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•

--create_partition_shipment.sql
do language plpgsql $$
declare 
rec_shipment_date RECORD ;
partition_name varchar;
index_name varchar;
current_year varchar ;
current_month varchar ;
begin_year varchar ;
begin_month varchar ;
next_year varchar ;
next_month varchar ;
first_flag boolean ;
i integer ;
begin
  RAISE NOTICE 'CREATE TEMPORARY TABLE FOR SHIPMENT_DATE';
  CREATE TEMP TABLE tmp_shipment_date as select distinct "SHIPMENT_DATE" from shipment order by "SHIPMENT_DATE" ;

  RAISE NOTICE 'DROP TABLE shipment';
  drop table shipment cascade ;
  
  CREATE TABLE public.shipment
  (
    "SHIPMENT_ID" integer NOT NULL DEFAULT nextval('shipment_shipment_id_seq'::regclass),
    "SHIPMENT_NAME" character varying(30) COLLATE pg_catalog."default",
    "SHIPMENT_DATE" timestamp without time zone,
    "REPORT_NAME" character varying(40) COLLATE pg_catalog."default"
  )
  PARTITION BY RANGE ("SHIPMENT_DATE")
  WITH (
      OIDS = FALSE
  )
  TABLESPACE pg_default;

  RAISE NOTICE 'CREATE PARTITIONS FOR TABLE shipment';

  current_year:='0';
  current_month:='0';

  begin_year := '0' ;
  begin_month := '0'  ;
  next_year := '0' ;
  next_month := '0'  ;

  FOR rec_shipment_date IN SELECT * FROM tmp_shipment_date LOOP
      
      RAISE NOTICE 'SHIPMENT_DATE=%',rec_shipment_date."SHIPMENT_DATE";
      
      current_year := date_part('year' ,rec_shipment_date."SHIPMENT_DATE");
      current_month := date_part('month' ,rec_shipment_date."SHIPMENT_DATE") ; 

      IF to_number(current_month,'99') < 10 THEN
        current_month := '0'||current_month ; 
      END IF ;

      --Init borders
      IF   begin_year = '0' THEN
       first_flag := true ; --first time flag
       begin_year := current_year ;
       begin_month := current_month ;   
   
        IF current_month = '12' THEN
          next_year := date_part('year' ,rec_shipment_date."SHIPMENT_DATE" + interval '1 year') ;
        ELSE
          next_year := current_year ;
        END IF;
     
       next_month := date_part('month' ,rec_shipment_date."SHIPMENT_DATE" + interval '1 month') ;

      END IF;

      -- Check current date into borders NOT for First time
      IF to_date( current_year||'.'||current_month, 'YYYY.MM') >= to_date( begin_year||'.'||begin_month, 'YYYY.MM') AND 
         to_date( current_year||'.'||current_month, 'YYYY.MM') < to_date( next_year||'.'||next_month, 'YYYY.MM') AND 
         NOT first_flag 
      THEN
         CONTINUE ; 
      ELSE
       --NEW borders only for second and after time 
       begin_year := current_year ;
       begin_month := current_month ;   
   
        IF current_month = '12' THEN
          next_year := date_part('year' ,rec_shipment_date."SHIPMENT_DATE" + interval '1 year') ;
        ELSE
          next_year := current_year ;
        END IF;
     
       next_month := date_part('month' ,rec_shipment_date."SHIPMENT_DATE" + interval '1 month') ;

      END IF;      

      partition_name := 'shipment_shipment_date_'||begin_year||'-'||begin_month||'-01-'|| next_year||'-'||next_month||'-01'  ;
 
     EXECUTE format('CREATE TABLE ' || quote_ident(partition_name) || ' PARTITION OF shipment FOR VALUES FROM ( %L ) TO ( %L )  ' , current_year||'-'||current_month||'-01' , next_year||'-'||next_month||'-01'  ) ; 

      index_name := partition_name||'_shipment_id_idx';
      RAISE NOTICE 'INDEX NAME =%',index_name;
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("SHIPMENT_ID") TABLESPACE pg_default ' ) ; 

      --Drop first time flag
      first_flag := false ;
   
  END LOOP;

end
$$;

เดกเด‚เดชเต เด‡เดฑเด•เตเด•เตเดฎเดคเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

pg_restore -d postgres --data-only --format=c --table=shipment --verbose  shipment.dmp > /tmp/data_dump/shipment_restore.log 2>&1

เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เดซเดฒเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต

เด…เดคเดฟเดจเตเดฑเต† เดซเดฒเดฎเดพเดฏเดฟ เดจเดฎเตเด•เตเด•เต เดŽเดจเตเดคเดพเดฃเต เด‰เดณเตเดณเดคเต? เดจเดฟเตผเดตเตเดตเดนเดฃ เดชเดฆเตเดงเดคเดฟเดฏเตเดŸเต† เดชเต‚เตผเดฃเตเดฃ เดตเดพเดšเด•เด‚ เดตเดฒเตเดคเตเด‚ เดตเดฟเดฐเดธเดตเตเดฎเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เด…เดจเตเดคเดฟเดฎ เดธเด‚เด–เตเดฏเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดธเตเดตเดฏเด‚ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเต เดคเดฟเด•เดšเตเดšเตเด‚ เดธเดพเดฆเตเดงเตเดฏเดฎเดพเดฃเต.

เด†เดฏเดฟเดฐเตเดจเตเดจเต

เดšเต†เดฒเดตเต: 502 997.55
เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเดฎเดฏเด‚: เด•เตเดธเดจเตเดฎเตเด•เตเดธ เดธเต†เด•เตเด•เตปเดกเต.

เด†เดฏเดฟ เดฎเดพเดฑเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต

เดšเต†เดฒเดตเต: 77 872.36
เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเดฎเดฏเด‚: เด•เตเดธเดจเตเดฎเตเด•เตเดธ เดธเต†เด•เตเด•เตปเดกเต.

เดคเดฟเด•เดšเตเดšเตเด‚ เดจเดฒเตเดฒ เดซเดฒเด‚. เดšเต†เดฒเดตเตเด‚ เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเดฎเดฏเดตเตเด‚ เด•เตเดฑเดšเตเดšเต. เด…เด™เตเด™เดจเต†, เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เด‰เดชเดฏเต‹เด—เด‚ เดชเตเดฐเดคเต€เด•เตเดทเดฟเดšเตเดš เดซเดฒเด‚ เดจเตฝเด•เตเดจเตเดจเต, เดชเตŠเดคเตเดตเต‡, เด†เดถเตเดšเดฐเตเดฏเดฎเดฟเดฒเตเดฒ.

เด‰เดชเดญเต‹เด•เตเดคเดพเดตเดฟเดจเต† เดธเดจเตเดคเต‹เดทเดฟเดชเตเดชเดฟเด•เตเด•เตเด•

เดชเดฐเดฟเดถเต‹เดงเดจเดพ เดซเดฒเด™เตเด™เตพ เด‰เดชเดญเต‹เด•เตเดคเดพเดตเดฟเดจเต เด…เดตเดฒเต‹เด•เดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดธเดฎเตผเดชเตเดชเดฟเดšเตเดšเต. เด…เดคเต เด…เดตเดฒเต‹เด•เดจเด‚ เดšเต†เดฏเตโ€Œเดค เดถเต‡เดทเด‚, เด…เดตเตผเด•เตเด•เต เด…เตฝเดชเตเดชเด‚ เด…เดชเตเดฐเดคเต€เด•เตเดทเดฟเดคเดฎเดพเดฏ เด’เดฐเต เดตเดฟเดงเดฟ เดฒเดญเดฟเดšเตเดšเต: โ€œเด•เตŠเดณเตเดณเดพเด‚, โ€œเดกเดพเดฑเตเดฑโ€ เดชเดŸเตเดŸเดฟเด• เดตเดฟเดญเดœเดฟเด•เตเด•เตเด•.โ€

เด…เดคเต†, เดŽเดจเตเดจเดพเตฝ เดžเด™เตเด™เตพ เดคเดฟเด•เดšเตเดšเตเด‚ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏ "เดทเดฟเดชเตเดชเตเดฎเต†เดจเตเดฑเต" เดชเดŸเตเดŸเดฟเด• เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดšเต; "เดกเดพเดฑเตเดฑ" เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ "SHIPMENT_DATE" เดซเต€เตฝเดกเต เด‡เดฒเตเดฒ.

เด•เตเดดเดชเตเดชเดฎเดฟเดฒเตเดฒ, เดšเต‡เตผเด•เตเด•เตเด•, เดฎเดพเดฑเตเดฑเตเด•. เดชเตเดฐเดงเดพเดจ เด•เดพเดฐเตเดฏเด‚, เด‰เดชเดญเต‹เด•เตเดคเดพเดตเต เดซเดฒเดคเตเดคเดฟเตฝ เดธเด‚เดคเตƒเดชเตเดคเดจเดพเดฃเต; เดจเดŸเดชเตเดชเดพเด•เตเด•เตฝ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพ เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเต เดชเตเดฐเดงเดพเดจเดฎเดฒเตเดฒ.

เดชเตเดฐเดงเดพเดจ เดชเดŸเตเดŸเดฟเด• "เดกเดพเดฑเตเดฑ" เดตเดฟเดญเดœเดฟเด•เตเด•เตเดจเตเดจเต

เดชเตŠเดคเตเดตเต‡, เดชเตเดฐเดคเตเดฏเต‡เด• เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเด•เตพ เด‰เดฃเตเดŸเดพเดฏเดฟเดฒเตเดฒ. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เด…เตฝเด—เต‹เดฐเดฟเดคเด‚, เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เด•เตเดฑเดšเตเดšเต เดฎเดพเดฑเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต.

"เดกเดพเดฑเตเดฑ" เดชเดŸเตเดŸเดฟเด•เดฏเดฟเดฒเต‡เด•เตเด•เต "SHIPMENT_DATA" เด•เต‹เดณเด‚ เดšเต‡เตผเด•เตเด•เตเดจเตเดจเต

psql -h ั…ะพัั‚ -U ะฑะฐะทะฐ -d ัŽะทะตั€
=> ALTER TABLE data ADD COLUMN "SHIPMENT_DATE" timestamp without time zone ;

"เดทเดฟเดชเตเดชเตเดฎเต†เดจเตเดฑเต" เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด…เดคเต‡ เดชเต‡เดฐเดฟเดฒเตเดณเตเดณ เด•เต‹เดณเดคเตเดคเดฟเดจเตเดฑเต† เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต "เดกเดพเดฑเตเดฑ" เดชเดŸเตเดŸเดฟเด•เดฏเดฟเดฒเต† "SHIPMENT_DATA" เด•เต‹เดณเดคเตเดคเดฟเดจเตเดฑเต† เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดชเต‚เดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเด•

-----------------------------
--update_data.sql
--updating for altered table "data" to values of "shipment_data" from the table "shipment"
--version 1.0
do language plpgsql $$
declare 
rec_shipment_data RECORD ;
shipment_date timestamp without time zone ; 
row_count integer ;
total_rows integer ;
begin

  select count(*) into total_rows from shipment ; 
  RAISE NOTICE 'Total %',total_rows;
  row_count:= 0 ;

  FOR rec_shipment_data IN SELECT * FROM shipment LOOP

   update data set "SHIPMENT_DATE" = rec_shipment_data."SHIPMENT_DATE" where "SHIPMENT_ID" = rec_shipment_data."SHIPMENT_ID";
   
   row_count:=  row_count +1 ;
   RAISE NOTICE 'row count = % , from %',row_count,total_rows;
  END LOOP;

end
$$;

"เดกเดพเดฑเตเดฑ" เดชเดŸเตเดŸเดฟเด•เดฏเตเดŸเต† เด’เดฐเต เดกเด‚เดชเต เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด•

pg_dump postgres --file=/dump/data.dmp --format=c --table=data --verbose > /dump/data.log 2>&1</source

เดชเดพเตผเดŸเตเดŸเต€เดทเตป เดšเต†เดฏเตเดค เดชเดŸเตเดŸเดฟเด• "เดกเดพเดฑเตเดฑ" เดตเต€เดฃเตเดŸเตเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•

--create_partition_data.sql
--create partitions for the table "wafer data" by range column "shipment_data" with one month duration
--version 1.0
do language plpgsql $$
declare 
rec_shipment_date RECORD ;
partition_name varchar;
index_name varchar;
current_year varchar ;
current_month varchar ;
begin_year varchar ;
begin_month varchar ;
next_year varchar ;
next_month varchar ;
first_flag boolean ;
i integer ;

begin

  RAISE NOTICE 'CREATE TEMPORARY TABLE FOR SHIPMENT_DATE';
  CREATE TEMP TABLE tmp_shipment_date as select distinct "SHIPMENT_DATE" from shipment order by "SHIPMENT_DATE" ;


  RAISE NOTICE 'DROP TABLE data';
  drop table data cascade ;


  RAISE NOTICE 'CREATE PARTITIONED TABLE data';
  
  CREATE TABLE public.data
  (
    "RUN_ID" integer,
    "LASERMARK" character varying(20) COLLATE pg_catalog."default" NOT NULL,
    "LOTID" character varying(80) COLLATE pg_catalog."default",
    "SHIPMENT_ID" integer NOT NULL,
    "PARAMETER_ID" integer NOT NULL,
    "INTERNAL_VALUE" character varying(75) COLLATE pg_catalog."default",
    "REPORTED_VALUE" character varying(75) COLLATE pg_catalog."default",
    "LOWER_SPEC_LIMIT" numeric,
    "UPPER_SPEC_LIMIT" numeric , 
    "SHIPMENT_DATE" timestamp without time zone
  )
  PARTITION BY RANGE ("SHIPMENT_DATE")
  WITH (
    OIDS = FALSE
  )
  TABLESPACE pg_default ;


  RAISE NOTICE 'CREATE PARTITIONS FOR TABLE data';

  current_year:='0';
  current_month:='0';

  begin_year := '0' ;
  begin_month := '0'  ;
  next_year := '0' ;
  next_month := '0'  ;
  i := 1;

  FOR rec_shipment_date IN SELECT * FROM tmp_shipment_date LOOP
      
      RAISE NOTICE 'SHIPMENT_DATE=%',rec_shipment_date."SHIPMENT_DATE";
      
      current_year := date_part('year' ,rec_shipment_date."SHIPMENT_DATE");
      current_month := date_part('month' ,rec_shipment_date."SHIPMENT_DATE") ; 

      --Init borders
      IF   begin_year = '0' THEN
       RAISE NOTICE '***Init borders';
       first_flag := true ; --first time flag
       begin_year := current_year ;
       begin_month := current_month ;   
   
        IF current_month = '12' THEN
          next_year := date_part('year' ,rec_shipment_date."SHIPMENT_DATE" + interval '1 year') ;
        ELSE
          next_year := current_year ;
        END IF;
     
       next_month := date_part('month' ,rec_shipment_date."SHIPMENT_DATE" + interval '1 month') ;

      END IF;

--      RAISE NOTICE 'current_year=% , current_month=% ',current_year,current_month;
--      RAISE NOTICE 'begin_year=% , begin_month=% ',begin_year,begin_month;
--      RAISE NOTICE 'next_year=% , next_month=% ',next_year,next_month;

      -- Check current date into borders NOT for First time

      RAISE NOTICE 'Current data = %',to_char( to_date( current_year||'.'||current_month, 'YYYY.MM'), 'YYYY.MM');
      RAISE NOTICE 'Begin data = %',to_char( to_date( begin_year||'.'||begin_month, 'YYYY.MM'), 'YYYY.MM');
      RAISE NOTICE 'Next data = %',to_char( to_date( next_year||'.'||next_month, 'YYYY.MM'), 'YYYY.MM');

      IF to_date( current_year||'.'||current_month, 'YYYY.MM') >= to_date( begin_year||'.'||begin_month, 'YYYY.MM') AND 
         to_date( current_year||'.'||current_month, 'YYYY.MM') < to_date( next_year||'.'||next_month, 'YYYY.MM') AND 
         NOT first_flag 
      THEN
         RAISE NOTICE '***CONTINUE';
         CONTINUE ; 
      ELSE
       --NEW borders only for second and after time 
       RAISE NOTICE '***NEW BORDERS';
       begin_year := current_year ;
       begin_month := current_month ;   
   
        IF current_month = '12' THEN
          next_year := date_part('year' ,rec_shipment_date."SHIPMENT_DATE" + interval '1 year') ;
        ELSE
          next_year := current_year ;
        END IF;
     
       next_month := date_part('month' ,rec_shipment_date."SHIPMENT_DATE" + interval '1 month') ;


      END IF;      

      IF to_number(current_month,'99') < 10 THEN
        current_month := '0'||current_month ; 
      END IF ;

      IF to_number(begin_month,'99') < 10 THEN
        begin_month := '0'||begin_month ; 
      END IF ;

      IF to_number(next_month,'99') < 10 THEN
        next_month := '0'||next_month ; 
      END IF ;

      RAISE NOTICE 'current_year=% , current_month=% ',current_year,current_month;
      RAISE NOTICE 'begin_year=% , begin_month=% ',begin_year,begin_month;
      RAISE NOTICE 'next_year=% , next_month=% ',next_year,next_month;

      partition_name := 'data_'||begin_year||begin_month||'01_'||next_year||next_month||'01'  ;

      RAISE NOTICE 'PARTITION NUMBER % , TABLE NAME =%',i , partition_name;
      
      EXECUTE format('CREATE TABLE ' || quote_ident(partition_name) || ' PARTITION OF data FOR VALUES FROM ( %L ) TO ( %L )  ' , begin_year||'-'||begin_month||'-01' , next_year||'-'||next_month||'-01'  ) ; 

      index_name := partition_name||'_shipment_id_parameter_id_idx';
      RAISE NOTICE 'INDEX NAME =%',index_name;
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("SHIPMENT_ID", "PARAMETER_ID") TABLESPACE pg_default ' ) ; 

      index_name := partition_name||'_lasermark_idx';
      RAISE NOTICE 'INDEX NAME =%',index_name;
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("LASERMARK" COLLATE pg_catalog."default") TABLESPACE pg_default ' ) ; 

      index_name := partition_name||'_shipment_id_idx';
      RAISE NOTICE 'INDEX NAME =%',index_name;
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("SHIPMENT_ID") TABLESPACE pg_default ' ) ; 

      index_name := partition_name||'_parameter_id_idx';
      RAISE NOTICE 'INDEX NAME =%',index_name;
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("PARAMETER_ID") TABLESPACE pg_default ' ) ; 

      index_name := partition_name||'_shipment_date_idx';
      RAISE NOTICE 'INDEX NAME =%',index_name;
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("SHIPMENT_DATE") TABLESPACE pg_default ' ) ; 

      --Drop first time flag
      first_flag := false ;

  END LOOP;
end
$$;

เด˜เดŸเตเดŸเด‚ 3-เตฝ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดš เดกเด‚เดชเต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•.

pg_restore -h ั…ะพัั‚ -ัŽะทะตั€ -d ะฑะฐะทะฐ --data-only --format=c --table=data --verbose  data.dmp > data_restore.log 2>&1

เดชเดดเดฏ เดกเดพเดฑเตเดฑเดฏเตเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดตเดฟเดญเดพเด—เด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•

---------------------------------------------------
--create_partition_for_old_dates.sql
--create partitions for keeping old dates 
--version 1.0
do language plpgsql $$
declare 
rec_shipment_date RECORD ;
partition_name varchar;
index_name varchar;

begin

      SELECT min("SHIPMENT_DATE") AS min_date INTO rec_shipment_date from data ;

      RAISE NOTICE 'Old date is %',rec_shipment_date.min_date ;

      partition_name := 'data_old_dates'  ;

      RAISE NOTICE 'PARTITION NAME IS %',partition_name;

      EXECUTE format('CREATE TABLE ' || quote_ident(partition_name) || ' PARTITION OF data FOR VALUES FROM ( %L ) TO ( %L )  ' , '1900-01-01' , 
              to_char( rec_shipment_date.min_date,'YYYY')||'-'||to_char(rec_shipment_date.min_date,'MM')||'-01'  ) ; 

      index_name := partition_name||'_shipment_id_parameter_id_idx';
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("SHIPMENT_ID", "PARAMETER_ID") TABLESPACE pg_default ' ) ; 

      index_name := partition_name||'_lasermark_idx';
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("LASERMARK" COLLATE pg_catalog."default") TABLESPACE pg_default ' ) ; 

      index_name := partition_name||'_shipment_id_idx';
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("SHIPMENT_ID") TABLESPACE pg_default ' ) ; 

      index_name := partition_name||'_parameter_id_idx';
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("PARAMETER_ID") TABLESPACE pg_default ' ) ; 

      index_name := partition_name||'_shipment_date_idx';
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("SHIPMENT_DATE") TABLESPACE pg_default ' ) ; 

end
$$;

เด…เดจเตเดคเดฟเดฎ เดซเดฒเด™เตเด™เตพ:

เด†เดฏเดฟเดฐเตเดจเตเดจเต
เดšเต†เดฒเดตเต: 502 997.55
เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเดฎเดฏเด‚: 505 เดธเต†เด•เตเด•เตปเดกเต.

เด†เดฏเดฟ เดฎเดพเดฑเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต
เดšเต†เดฒเดตเต: 68 533.70
เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเดฎเดฏเด‚: 69 เดจเดฟเดฎเดฟเดทเด™เตเด™เตพ

เดฏเต‹เด—เตเดฏเตป, เดคเดฟเด•เดšเตเดšเตเด‚ เดฏเต‹เด—เตเดฏเตป. เดชเต‹เดธเตโ€Œเดฑเตเดฑเตโ€Œเด—เตเดฐเต†เดŽเดธเตโ€Œเด•เตเดฏเตเดŽเตฝ 10-เดฒเต† เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด‚ เด•เต‚เดŸเตเดคเดฒเต‹ เด•เตเดฑเดตเต‹ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เด•เดดเดฟเดžเตเดžเต - เด’เดฐเต เดฎเดฟเด•เดšเตเดš เดซเดฒเด‚.

เดฒเดฟเดฑเดฟเด•เตเด•เตฝ เดกเดฟเด—เตเดฐเดทเตป

เด‡เดคเดฟเดฒเตเด‚ เดฎเดฟเด•เดšเตเดšเดคเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเดฎเต‹ - เด…เดคเต†, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดดเดฟเดฏเตเด‚!เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เดฎเต†เดฑเตเดฑเต€เดฐเดฟเดฏเดฒเตˆเดธเตเดกเต เดตเตเดฏเต‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.
เดฎเต†เดฑเตเดฑเต€เดฐเดฟเดฏเดฒเตˆเดธเตเดกเต เดตเตเดฏเต‚ LASERMARK_VIEW เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•

CREATE MATERIALIZED VIEW LASERMARK_VIEW 
AS
SELECT w."LASERMARK" , MAX(s."SHIPMENT_DATE") AS "SHIPMENT_DATE"
FROM shipment s INNER JOIN data w ON s."SHIPMENT_ID" = w."SHIPMENT_ID" 
GROUP BY w."LASERMARK" ;

CREATE INDEX lasermark_vw_shipment_date_ind on lasermark_view USING btree ("SHIPMENT_DATE") TABLESPACE pg_default;
analyze lasermark_view ;

เด’เดฐเดฟเด•เตเด•เตฝ เด•เต‚เดŸเดฟ เดžเด™เตเด™เตพ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดฎเดพเดฑเตเดฑเดฟเดฏเต†เดดเตเดคเตเดจเตเดจเต:
เดตเดธเตเดคเตเดจเดฟเดทเตเด เดฎเดพเดฏ เด•เดพเดดเตเดš เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดจเตเดตเต‡เดทเดฃเด‚

SELECT
            p."PARAMETER_ID" as  parameter_id,
            pc."PC_NAME" AS pc_name,
            pc."CUSTOMER_PARTNUMBER" AS customer_partnumber,
            w."LASERMARK" AS lasermark,
            w."LOTID" AS lotid,
            w."REPORTED_VALUE" AS reported_value,
            w."LOWER_SPEC_LIMIT" AS lower_spec_limit,
            w."UPPER_SPEC_LIMIT" AS upper_spec_limit,
            p."TYPE_CALCUL" AS type_calcul,
            s."SHIPMENT_NAME" AS shipment_name,
            s."SHIPMENT_DATE" AS shipment_date,
            extract(year from s."SHIPMENT_DATE") AS year,
            extract(month from s."SHIPMENT_DATE") as month,
            s."REPORT_NAME" AS report_name,
            p."STC_NAME" AS STC_name,
            p."CUSTOMERPARAM_NAME" AS customerparam_name
        FROM data w INNER JOIN shipment s ON s."SHIPMENT_ID" = w."SHIPMENT_ID"
             INNER JOIN parameters p ON p."PARAMETER_ID" = w."PARAMETER_ID"
             INNER JOIN shipment_pc sp ON s."SHIPMENT_ID" = sp."SHIPMENT_ID"
             INNER JOIN pc pc ON pc."PC_ID" = sp."PC_ID"
             INNER JOIN LASERMARK_VIEW md ON md."SHIPMENT_DATE" = s."SHIPMENT_DATE" AND md."LASERMARK" = w."LASERMARK"
        WHERE 
              s."SHIPMENT_DATE" >= '2018-07-01' AND s."SHIPMENT_DATE" <= '2018-09-30';

เดžเด™เตเด™เตพเด•เตเด•เต เดฎเดฑเตเดฑเตŠเดฐเต เดซเดฒเด‚ เดฒเดญเดฟเด•เตเด•เตเด‚:
เด†เดฏเดฟเดฐเตเดจเตเดจเต
เดšเต†เดฒเดตเต: 502 997.55
เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเดฎเดฏเด‚: 505 เดธเต†เด•เตเด•เตปเดกเต

เด†เดฏเดฟ เดฎเดพเดฑเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต
เดšเต†เดฒเดตเต: 42 481.16
เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเดฎเดฏเด‚: เด•เตเดธเดจเตเดฎเตเด•เตเดธ เดธเต†เด•เตเด•เตปเดกเต.

เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เดตเดพเด—เตเดฆเดพเดจเดชเดฐเดฎเดพเดฏ เดซเดฒเด‚ เดตเดžเตเดšเดจเดพเดชเดฐเดฎเดพเดฃเต†เด™เตเด•เดฟเดฒเตเด‚, เด†เดถเดฏเด™เตเด™เตพ เดชเตเดคเตเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด…เดคเดฟเดจเดพเตฝ เดกเดพเดฑเตเดฑ เดฒเดญเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดฎเตŠเดคเตเดคเด‚ เดธเดฎเดฏเด‚ เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เดธเดนเดพเดฏเดฟเด•เตเด•เดฟเดฒเตเดฒ. เดŽเดจเตเดจเดพเตฝ เด’เดฐเต เดชเดฐเต€เด•เตเดทเดฃเด‚ เดŽเดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ เด‡เดคเต เดตเดณเดฐเต† เดฐเดธเด•เดฐเดฎเดพเดฃเต.

เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ, เด…เดคเต เดฎเดพเดฑเดฟเดฏเดคเตเดชเต‹เดฒเต†, เดตเต€เดฃเตเดŸเตเด‚ เดจเดจเตเดฆเดฟ asmm เด’เดชเตเดชเด‚ เดนเดฌเตเดฐเต!- เดšเต‹เดฆเตเดฏเด‚ เด•เต‚เดŸเตเดคเตฝ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดพเด‚.

Afterword

เด…เดคเดฟเดจเดพเตฝ, เด‰เดชเดญเต‹เด•เตเดคเดพเดตเต เดธเด‚เดคเตƒเดชเตเดคเดจเดพเดฃเต. เด’เดชเตเดชเด‚ เด†เดตเดถเตเดฏเด‚ เดธเดพเดนเดšเดฐเตเดฏเด‚ เดฎเตเดคเดฒเต†เดŸเตเด•เตเด•เตเด•.

เดชเตเดคเดฟเดฏ เดšเตเดฎเดคเดฒ: เด†เดดเดคเตเดคเดฟเดฒเดพเด•เตเด•เดพเดจเตเด‚ เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดจเตเดคเดพเดฃเต เด•เตŠเดฃเตเดŸเตเดตเดฐเดพเตป เด•เดดเดฟเดฏเตเด•?

เด…เดชเตเดชเต‹เตพ เดžเดพเตป เด“เตผเด•เตเด•เตเดจเตเดจเต - เดธเตเดนเตƒเดคเตเดคเตเด•เตเด•เดณเต‡, เดžเด™เตเด™เดณเตเดŸเต† PostgreSQL เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด•เดณเตเดŸเต† เดจเดฟเดฐเต€เด•เตเดทเดฃเด‚ เดžเด™เตเด™เตพเด•เตเด•เดฟเดฒเตเดฒ.

AWS-เตฝ เด•เตเดฒเต—เดกเต เดตเดพเดšเตเดšเดฟเดจเตเดฑเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เด‡เดชเตเดชเต‹เดดเตเด‚ เด•เตเดฑเดšเตเดšเต เดจเดฟเดฐเต€เด•เตเดทเดฃเดฎเตเดฃเตเดŸเต. เดŽเดจเตเดจเดพเตฝ DBA-เดฏเตเด•เตเด•เต เดˆ เดจเดฟเดฐเต€เด•เตเดทเดฃเดคเตเดคเดฟเดจเตเดฑเต† เดชเตเดฐเดฏเต‹เดœเดจเด‚ เดŽเดจเตเดคเดพเดฃเต? เดชเตŠเดคเตเดตเต‡, เดชเตเดฐเดพเดฏเต‹เด—เดฟเด•เดฎเดพเดฏเดฟ เด’เดจเตเดจเตเดฎเดฟเดฒเตเดฒ.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดตเตเด‚ เดฐเดธเด•เดฐเดตเตเดฎเดพเดฏ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดšเต†เดฏเตเดฏเดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดตเดธเดฐเดฎเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดˆ เด…เดตเดธเดฐเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดฏเต‹เดœเดจเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ ...
เดตเต‡เดฃเตเดŸเดฟ

เดธเดจเตเดคเต‹เดทเด•เดฐเดฎเดพเดฏ เดชเดพเตผเดŸเตเดŸเดฟ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ PostgreSQL10-เตฝ เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เด…เดฑเดฟเดฏเตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด“เตผเดฎเตเดฎเด•เดณเตเดŸเต† เดฐเดฃเตเดŸเต เดตเดฐเดฟเด•เตพ

เดžเด™เตเด™เตพ เดเดฑเตเดฑเดตเตเด‚ เดฐเดธเด•เดฐเดฎเดพเดฏ เดญเดพเด—เดคเตเดคเต‡เด•เตเด•เต เดตเดฐเตเดจเตเดจเดคเต เด‡เด™เตเด™เดจเต†เดฏเดพเดฃเต:

เดกเดฟเดธเด‚เดฌเตผ 3, 2018.
PostgreSQL เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเด•เดŸเดจเด‚ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฒเดญเตเดฏเดฎเดพเดฏ เด•เดดเดฟเดตเตเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด—เดตเต‡เดทเดฃเด‚ เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเตป เด’เดฐเต เดคเต€เดฐเตเดฎเดพเดจเด‚ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต.

เดŽเดจเตเดจเดพเตฝ เด…เดคเต เดคเดฟเด•เดšเตเดšเตเด‚ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏ เด’เดฐเต เด•เดฅเดฏเดพเดฃเต.

เดคเตเดŸเดฐเตเด‚โ€ฆ

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•