Happy Party เบซเบผเบทเบชเบญเบ‡เบชเบฒเบกเป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบฎเบนเป‰เบˆเบฑเบเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เปƒเบ™ PostgreSQL10

เบ„เปเบฒเบ™เปเบฒเบซเบผเบทเบงเบดเบ—เบตเบเบฒเบ™เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบžเบฒเบเบชเปˆเบงเบ™เป„เบ”เป‰เบกเบฒเบเปˆเบฝเบงเบเบฑเบš

เป€เบฅเบทเปˆเบญเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบ™เบตเป‰: เป€เบˆเบปเป‰เบฒเบˆเบทเปˆเป„เบ”เป‰เบšเปเบงเปˆเบฒเบกเบฑเบ™เบ—เบฑเบ‡เปเบปเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบ™เบงเปƒเบ”. เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เปเบฅเบฐเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบเบทเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป, เปƒเบ™เป€เบงเบฅเบฒเบ™เบฑเป‰เบ™, เป„เบ”เป‰เบซเบกเบปเบ”เป„เบ›, เบ„เปเบฒเบ–เบฒเบกเบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™ - เปเบกเปˆเบ™เบซเบเบฑเบ‡เบ•เปเปˆเป„เบ›? เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เป„เบ”เป‰เป€เบเบตเบ”เบ‚เบทเป‰เบ™.

Happy Party เบซเบผเบทเบชเบญเบ‡เบชเบฒเบกเป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบฎเบนเป‰เบˆเบฑเบเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เปƒเบ™ PostgreSQL10

เป€เบ™เบทเป‰เบญเบฎเป‰เบญเบ‡ เบ—เบณเบ™เบญเบ‡:
เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™ 'เปƒเบ™เป€เบงเบฅเบฒเบ™เบฑเป‰เบ™', เป€เบžเบฒเบฐเบงเปˆเบฒ เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เบซเบฑเบ™เบญเบญเบ, เบกเบตเบชเบฐเบซเบ‡เบงเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰... เบ‚เบญเบšโ€‹เปƒเบˆ asmm เปเบฅเบฐ Habru!

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เบญเบตเบเปเบ”เปˆเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบนเบเบ„เป‰เบฒเบกเบตเบ„เบงเบฒเบกเบชเบธเบ, เปเบฅเบฐเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™เบ›เบฑเบšเบ›เบธเบ‡เบ—เบฑเบเบชเบฐเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡?

เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบชเบญเบ‡เบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™:
1) เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡ - เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™, เบ›เปˆเบฝเบ™เปเบ›เบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ;
2) เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเป€เบ‚เบฑเป‰เบกเบ‚เบธเป‰เบ™ - เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปเบšเบšเบชเบญเบšเบ–เบฒเบก

เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบฎเบฑเบ”เป€เบฅเบทเป‰เบกเบ„เบทเบ™, เปƒเบ™เป€เบงเบฅเบฒเบ™เบฑเป‰เบ™เบกเบฑเบ™เบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบกเบตเบซเบเบฑเบ‡เบ›เปˆเบฝเบ™เปเบ›เบ‡เบญเบตเบเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป€เบžเบทเปˆเบญเป€เบฅเบฑเปˆเบ‡, เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ”เป‰เบ–เบทเบเป€เบฅเบทเบญเบ - เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบเบฒเบ™เบญเบญเบเปเบšเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ„เปเบฒเบ–เบฒเบกเบ•เบปเป‰เบ™เบ•เปเบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™: เปเบกเปˆเบ™เบซเบเบฑเบ‡เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบ™เบงเปƒเบ”?

เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™

เบ›เบฐเบเบฒเบ™เบ—เปเบฒเบญเบดเบ”, เบกเบต ERD เบ™เบตเป‰ (เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚):
Happy Party เบซเบผเบทเบชเบญเบ‡เบชเบฒเบกเป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบฎเบนเป‰เบˆเบฑเบเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เปƒเบ™ 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 เบงเบดเบ™เบฒเบ—เบต.

เบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™เบซเบเบฑเบ‡? เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ›เบปเบเบเบฐเบ•เบด, เบญเบตเบ‡เปƒเบชเปˆเบชเปˆเบงเบ™เบ—เบตเปˆเปƒเบŠเป‰เป€เบงเบฅเบฒ.
เบ‚เปเปƒเบซเป‰เบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบธเบ”: เบ–เป‰เบฒเบกเบตเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป€เบงเบฅเบฒ, เบกเบฑเบ™เบˆเบฐเบŠเปˆเบงเบเบžเบงเบเป€เบฎเบปเบฒเบšเป? เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบชเบดเบ” - เบเบฒเบ™เปเบšเปˆเบ‡เบชเปˆเบงเบ™.

เบžเบฒเบเบชเปˆเบงเบ™เปƒเบ”?

เบขเบนเปˆ glance เบ—เปเบฒเบญเบดเบ”, เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปเบกเปˆเบ™เบˆเบฐเปเบˆเป‰เบ‡ - เบ›เบฐเบเบฒเบ”เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ "เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡" เป‚เบ”เบเปƒเบŠเป‰เบ›เบธเปˆเบก "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 เป„เบ”เป‰เบฅเบงเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป€เบ›เบฑเบ™ script เบซเบ™เบถเปˆเบ‡.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™:
เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ–เบดเป‰เบกเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบซเบผเปˆเบ‡

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
เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”: เบงเบดเบ™เบฒเบ—เบต 505.

เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™

เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบ: 77 872.36
เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”: เบงเบดเบ™เบฒเบ—เบต 79.

เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เป€เบ›เบฑเบ™เบœเบปเบ™เบ”เบต. เบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเปเบฅเบฐเป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เปƒเบซเป‰เบœเบปเบ™เบเบฐเบ—เบปเบšเบ—เบตเปˆเบ„เบฒเบ”เป„เบงเป‰เปเบฅเบฐ, เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเปเบ›เบเปƒเบˆ.

เป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบนเบเบ„เป‰เบฒเบกเบตเบ„เบงเบฒเบกเบชเบธเบ

เบœเบปเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เบฅเบนเบเบ„เป‰เบฒเบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™. เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบกเบฑเบ™, เบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ„เปเบฒเบ•เบฑเบ”เบชเบดเบ™เบ—เบตเปˆเบšเปเปˆเบ„เบฒเบ”เบ„เบดเบ”: "เบ”เบตเบซเบผเบฒเบ, เปเบšเปˆเบ‡เบ›เบฑเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ "เบ‚เปเป‰เบกเบนเบ™".

เปเบกเปˆเบ™เปเบฅเป‰เบง, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ "เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡" เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบขเปˆเบฒเบ‡เบชเบดเป‰เบ™เป€เบŠเบตเบ‡; เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ "เบ‚เปเป‰เบกเบนเบ™" เบšเปเปˆเบกเบตเบŠเปˆเบญเบ‡เปƒเบชเปˆเบ‚เปเป‰เบกเบนเบ™ "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
$$;

เป‚เบซเบผเบ” dump เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™ 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

เบชเบปเบกเบ„เบงเบ™, เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบชเบปเบกเบ„เบงเบ™. เปเบฅเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเปˆเบฒเบ•เบฒเบกเบงเบดเบ—เบตเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เบซเบผเบฒเบเบซเบผเบทเบซเบ™เป‰เบญเบเปเบกเปˆเบšเบปเบ”เบเบปเบ™เป„เบเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เปƒเบ™ PostgreSQL 10 - เป€เบ›เบฑเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบ”เบตเป€เบฅเบตเบ”.

เบเบฒเบ™เบเปˆเบญเบเบญเบฒเบซเบฒเบ™เบ”เบปเบ™

เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบšเปเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เป„เบ”เป‰เบ”เบตเบเบงเปˆเบฒ - เปเบกเปˆเบ™เปเบฅเป‰เบง, เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”!เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰ MATERIALIZED VIEW.
เบชเป‰เบฒเบ‡ MATTERIALIZED VIEW 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
เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”: เบงเบดเบ™เบฒเบ—เบต 43.

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ, เปเบ™เปˆเบ™เบญเบ™, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบ”เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบ›เบฑเบ™เบเบฒเบ™เบซเบผเบญเบเบฅเบงเบ‡; เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เปƒเบซเบกเปˆ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบงเบฅเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบˆเบฐเบšเปเปˆเบŠเปˆเบงเบเบซเบผเบฒเบ. เปเบ•เปˆเป€เบ›เบฑเบ™เบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เบกเบฑเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ”เบต.

เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เป„เบ”เป‰เบซเบฑเบ™เบญเบญเบ, เบ‚เบญเบšเปƒเบˆเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡ asmm เปเบฅเบฐ Habru!- เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เบ•เบทเปˆเบกเบญเบตเบ.

Afterword

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบฅเบนเบเบ„เป‰เบฒเบžเปเปƒเบˆ. เปเบฅเบฐ เบ•เป‰เบญเบ‡เบเบฒเบ™ เปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™.

เบงเบฝเบเบ‡เบฒเบ™เปƒเปเปˆ: เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบฅเบปเบ‡เป€เบฅเบดเบ เปเบฅเบฐ เบ‚เบฐเบซเบเบฒเบเบญเบฑเบ™เปƒเบ”เปเบ”เปˆ?

เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบทเปˆ - guys, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบกเบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ PostgreSQL เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เบ”เป‰เบงเบเบซเบปเบงเปƒเบˆ, เบเบฑเบ‡เบกเบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบšเบฒเบ‡เบขเปˆเบฒเบ‡เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡ Cloud Watch เปƒเบ™ AWS. เปเบ•เปˆเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ™เบตเป‰เบชเปเบฒเบฅเบฑเบš DBA เปเบกเปˆเบ™เบซเบเบฑเบ‡? เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบšเปเปˆเบกเบต.

เบ–เป‰เบฒเป€เบˆเบปเป‰เบฒเบกเบตเป‚เบญเบเบฒเบ”เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ” เปเบฅเบฐ เปœเป‰เบฒเบชเบปเบ™เปƒเบˆเบชเบณเบฅเบฑเบšเบ•เบปเบ™เป€เบญเบ‡, เป€เบˆเบปเป‰เบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเบงเบเป‚เบญเบเบฒเบ”เบ™เบตเป‰...
เบชเปเบฒเบฅเบฑเบš

Happy Party เบซเบผเบทเบชเบญเบ‡เบชเบฒเบกเป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบฎเบนเป‰เบˆเบฑเบเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เปƒเบ™ PostgreSQL10

เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบกเบฒเบฎเบญเบ”เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบชเบธเบ”:

เบงเบฑเบ™เบ—เบต 3 เบ—เบฑเบ™เบงเบฒ 2018.
เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ„เบปเป‰เบ™เบ„เบงเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบเบงเบ”เบเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก PostgreSQL.

เปเบ•เปˆเบ™เบฑเป‰เบ™เปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบกเบปเบ”.

เบ•เบดเบ”โ€‹เบ•เบฒเบกโ€‹เบ•เบญเบ™โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€ฆ

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™