αž–αž·αž’αžΈαž‡αž”αŸ‹αž›αŸ€αž„αžšαžΈαž€αžšαžΆαž™ αž¬αž’αž“αž»αžŸαŸ’αžŸαžΆαžœαžšαžΈαž™αž–αžΈαžšαž”αžΈαž‡αž½αžšαž’αŸ†αž–αžΈαž€αžΆαžšαžŸαŸ’αž‚αžΆαž›αŸ‹αž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αž“αŸ…αž€αŸ’αž“αž»αž„ PostgreSQL10

αž”αž»αž–αŸ’αžœαž€αžαžΆ ឬ αžšαž”αŸ€αž”αžŠαŸ‚αž›αž‚αŸ†αž“αž·αžαž“αŸƒαž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αž€αžΎαžαž‘αžΎαž„

αžšαžΏαž„αž“αŸαŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ– αžαžΎαž’αŸ’αž“αž€αž…αžΆαŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„αž αžΎαž™αž˜αŸ’αžαž„αž‘αŸ€αžαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž’αž“αž’αžΆαž“αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŸαŸ†αžŽαžΎαž“αŸ…αž–αŸαž›αž“αŸ„αŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžŸαŸ‹αž αžΎαž™αžŸαŸ†αžŽαž½αžšαž”αžΆαž“αž€αžΎαžαž‘αžΎαž„ - αžαžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‘αŸ€αž? αž“αŸαŸ‡αž‡αžΆαžšαž”αŸ€αž”αžŠαŸ‚αž›αž‚αŸ†αž“αž·αžαž“αŸƒαž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αŸ”

αž–αž·αž’αžΈαž‡αž”αŸ‹αž›αŸ€αž„αžšαžΈαž€αžšαžΆαž™ αž¬αž’αž“αž»αžŸαŸ’αžŸαžΆαžœαžšαžΈαž™αž–αžΈαžšαž”αžΈαž‡αž½αžšαž’αŸ†αž–αžΈαž€αžΆαžšαžŸαŸ’αž‚αžΆαž›αŸ‹αž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αž“αŸ…αž€αŸ’αž“αž»αž„ PostgreSQL10

αž€αžΆαžšβ€‹αž”αŸ†αž”αŸ’αž›αŸ‚αž„β€‹αž’αžαŸ’αžαž”αž‘β€‹αž…αž˜αŸ’αžšαŸ€αž„αŸ–
αž…αŸ’αž”αžΆαžŸαŸ‹αžŽαžΆαžŸαŸ‹ 'αž“αŸ…αž–αŸαž›αž“αŸ„αŸ‡' αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αžŠαžΌαž…αžŠαŸ‚αž›αžœαžΆαž”αžΆαž“αž”αŸ’αžšαŸ‚αž€αŸ’αž›αžΆαž™ αž˜αžΆαž“αž‘αž»αž“αž”αŸ†αžšαž»αž„αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŠαŸ‚αž›αž˜αž·αž“αž”αžΆαž“αž”αŸ’αžšαžΎαŸ” αžŸαžΌαž˜αž’αžšαž‚αž»αžŽ ធអសម αž“αž·αž„ Habru!

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžαžΎβ€‹αž’αŸ’αžœαžΎβ€‹αžŠαžΌαž…αž˜αŸ’αžαŸαž…β€‹αž‘αŸ€αžβ€‹αžŠαŸ‚αž›β€‹αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž’αŸ’αžœαžΎβ€‹αž±αŸ’αž™β€‹αž’αžαž·αžαž·αž‡αž“β€‹αžŸαž”αŸ’αž”αžΆαž™β€‹αž…αž·αžαŸ’αž αž αžΎαž™β€‹αž‘αž“αŸ’αž‘αžΉαž˜β€‹αž“αžΉαž„β€‹αž“αŸ„αŸ‡β€‹αž€αŸβ€‹αž”αž„αŸ’αž€αžΎαž“β€‹αž‡αŸ†αž“αžΆαž‰β€‹αžšαž”αžŸαŸ‹β€‹αž’αŸ’αž“αž€β€‹αžŠαŸ‚αžš?

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ”αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž˜αžΆαž“αžœαž·αž’αžΈαž–αžΈαžšαž™αŸ‰αžΆαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž’αŸ„αž™αž”αŸ’αžšαžŸαžΎαžšαž‘αžΎαž„αž“αžΌαžœαž’αŸ’αžœαžΈαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ–
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
αž–αŸαž›αžœαŸαž›αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αŸ– ៀαŸ₯ αžœαž·αž“αžΆαž‘αžΈαŸ”

αžαžΎαž™αžΎαž„αžƒαžΎαž‰αž’αŸ’αžœαžΈ? αžŸαŸ†αžŽαžΎαž‘αŸ€αž„αž‘αžΆαžαŸ‹ αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž–αŸαž›αžœαŸαž›αžΆαŸ”
αž…αžΌαžšβ€‹αž’αŸ’αžœαžΎβ€‹αž€αžΆαžšβ€‹αžŸαž“αŸ’αž˜αžαŸ‹β€‹αž‘αžΌαž‡αžΈαžαž›β€‹αžŸαžΆαž˜αž‰αŸ’αž‰β€‹αž”αŸ†αž•αž»αžαŸ– αž”αŸ’αžšαžŸαž·αž“β€‹αž”αžΎβ€‹αž˜αžΆαž“β€‹αž‚αŸ†αžšαžΌβ€‹αž“αŸƒβ€‹αž–αŸαž›αžœαŸαž›αžΆβ€‹αž˜αž½αž™ αžαžΎβ€‹αžœαžΆβ€‹αž“αžΉαž„β€‹αž‡αž½αž™β€‹αž™αžΎαž„β€‹αž”αžΆαž“β€‹αž‘αŸ? αž“αŸ„αŸ‡αž‡αžΆαž€αžΆαžšαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ - αž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αŸ”

αž•αŸ’αž“αŸ‚αž€αž’αŸ’αžœαžΈ?

αž“αŸ… 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 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαŸ‚αž˜αž½αž™αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡:
αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž”αŸ„αŸ‡αž…αŸ„αž›αžαžΆαžšαžΆαž„αž”αŸ’αžšαž—αž–

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.55th
αž–αŸαž›αžœαŸαž›αžΆαž’αž“αž»αžœαžαŸ’αžαŸ– 505 αžœαž·αž“αžΆαž‘αžΈαŸ”

αž”αžΆαž“β€‹αž€αŸ’αž›αžΆαž™αž‡αžΆ

αžαž˜αŸ’αž›αŸƒ: 77 αž•αŸ’αž›αžΌαžœαž‘αžΈ 872.36th
αž–αŸαž›αžœαŸαž›αžΆαž’αž“αž»αžœαžαŸ’αžαŸ– 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
$$;

αž•αŸ’αž‘αž»αž€αžŸαŸ†αžšαžΆαž˜αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž€αŸ’αž“αž»αž„αž‡αŸ†αž αžΆαž“αž‘αžΈ 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.55th
αž–αŸαž›αžœαŸαž›αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αŸ– ៀαŸ₯ αžœαž·αž“αžΆαž‘αžΈαŸ”

αž”αžΆαž“β€‹αž€αŸ’αž›αžΆαž™αž‡αžΆ
αžαž˜αŸ’αž›αŸƒ: 68 αž•αŸ’αž›αžΌαžœαž‘αžΈ 533.70th
αž–αŸαž›αžœαŸαž›αžΆαž’αž“αž»αžœαžαŸ’αžαŸ– 69 αžœαž·αž“αžΆαž‘αžΈ

αžŸαž€αŸ’αžαž·αžŸαž˜ αžŸαž€αŸ’αžαž·αžŸαž˜αžŽαžΆαžŸαŸ‹αŸ” αž αžΎαž™αž–αž·αž…αžΆαžšαžŽαžΆαžαžΆαžαžΆαž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž™αžΎαž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αŸ’αžšαžΎαž“αž¬αžαž·αž…αž’αŸ’αžœαžΎαž‡αžΆαž˜αŸ’αž…αžΆαžŸαŸ‹αž“αŸƒαž™αž“αŸ’αžαž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αž“αŸ…αž€αŸ’αž“αž»αž„ PostgreSQL 10 - αž›αž‘αŸ’αž’αž•αž›αžŠαŸαž›αŸ’αž’αŸ”

digression αž’αžαŸ’αžαž”αž‘αž…αž˜αŸ’αžšαŸ€αž„

αžαžΎβ€‹αžœαžΆβ€‹αž’αžΆαž…β€‹αž’αŸ’αžœαžΎβ€‹αž”αžΆαž“β€‹αž›αŸ’αž’β€‹αž‡αžΆαž„β€‹αž“αŸαŸ‡β€‹αž‘αŸ - αž”αžΆαž‘ αž’αŸ’αž“αž€β€‹αž’αžΆαž…!αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎ MATERIALIZED 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.55th
αž–αŸαž›αžœαŸαž›αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·: ០.αŸ₯ αžœαž·αž“αžΆαž‘αžΈ

αž”αžΆαž“β€‹αž€αŸ’αž›αžΆαž™αž‡αžΆ
αžαž˜αŸ’αž›αŸƒ: 42 αž•αŸ’αž›αžΌαžœαž‘αžΈ 481.16th
αž–αŸαž›αžœαŸαž›αžΆαž’αž“αž»αžœαžαŸ’αžαŸ– 43 αžœαž·αž“αžΆαž‘αžΈαŸ”

αž‘αŸ„αŸ‡αž”αžΈβ€‹αž‡αžΆβ€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž–αž·αžβ€‹αžŽαžΆαžŸαŸ‹ αž›αž‘αŸ’αž’αž•αž›β€‹αžŠαŸβ€‹αž‡αŸ„αž‚αž‡αŸαž™β€‹αž”αŸ‚αž”β€‹αž“αŸαŸ‡β€‹αž‚αžΊβ€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž”αŸ„αž€β€‹αž”αž‰αŸ’αž†αŸ„αžβ€‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž‚αŸ†αž“αž·αžβ€‹αžαŸ’αžšαžΌαžœβ€‹αžαŸ‚β€‹αž’αŸ’αžœαžΎβ€‹αž±αŸ’αž™β€‹αžŸαŸ’αžšαžŸαŸ‹β€‹αžŸαŸ’αžšαžΆαž™αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž–αŸαž›αžœαŸαž›αžΆαžŸαžšαž»αž”αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‘αž‘αž½αž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αžΉαž„αž˜αž·αž“αž‡αž½αž™αž…αŸ’αžšαžΎαž“αž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž€αžΆαžšαž–αž·αžŸαŸ„αž’αž“αŸαžœαžΆαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžŽαžΆαžŸαŸ‹αŸ”

αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αžŠαžΌαž…αžŠαŸ‚αž›αžœαžΆαž”αžΆαž“αž”αŸ’αžšαŸ‚αž€αŸ’αž›αžΆαž™ αžŸαžΌαž˜αž’αžšαž‚αž»αžŽαž˜αŸ’αžαž„αž‘αŸ€αž ធអសម αž“αž·αž„ Habru! αžŸαŸ†αžŽαž½αžšαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ‚αž›αž˜αŸ’αž’αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαŸ”

Afterword

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αžαž·αžαž·αž‡αž“αž–αŸαž‰αž…αž·αžαŸ’αžαŸ” αž“αž·αž„ αžαŸ’αžšαžΌαžœαž€αžΆαžš αž‘αžΆαž‰αž™αž€αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž–αžΈαžŸαŸ’αžαžΆαž“αž—αžΆαž–αŸ”

αž€αž·αž…αŸ’αž…αž€αžΆαžšαžαŸ’αž˜αžΈαŸ”αŸ– αžαžΎβ€‹αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž’αŸ’αžœαžΈβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ… αž“αž·αž„β€‹αž–αž„αŸ’αžšαžΈαž€?

αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αž‰αž»αŸ†αž…αž„αž…αžΆαŸ† - αž”αž»αžšαžŸαž™αžΎαž„αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αžšαž”αžŸαŸ‹αž™αžΎαž„αž‘αŸαŸ”

αžŠαŸƒαž“αŸ…αž›αžΎαž”αŸαŸ‡αžŠαžΌαž„αž“αŸ…αžαŸ‚αž˜αžΆαž“αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸƒ Cloud Watch αž“αŸ…αž›αžΎ AWS αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΎαž’αŸ’αžœαžΈαž‡αžΆαž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸƒαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž“αŸαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ DBA? αž‡αžΆαž‘αžΌαž‘αŸ…αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž˜αž·αž“αž˜αžΆαž“αž‘αŸαŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αžΆαž“αž±αž€αžΆαžŸαž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ αž“αž·αž„αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž›αž½αž“αž’αŸ’αž“αž€ αž’αŸ’αž“αž€αž˜αž·αž“αž’αžΆαž…αž‘αžΆαž‰αž™αž€αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž–αžΈαž±αž€αžΆαžŸαž“αŸαŸ‡αž”αžΆαž“αž‘αŸβ€¦
αžŸαž˜αŸ’αžšαžΆαž”αŸ‹

αž–αž·αž’αžΈαž‡αž”αŸ‹αž›αŸ€αž„αžšαžΈαž€αžšαžΆαž™ αž¬αž’αž“αž»αžŸαŸ’αžŸαžΆαžœαžšαžΈαž™αž–αžΈαžšαž”αžΈαž‡αž½αžšαž’αŸ†αž–αžΈαž€αžΆαžšαžŸαŸ’αž‚αžΆαž›αŸ‹αž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αž“αŸ…αž€αŸ’αž“αž»αž„ PostgreSQL10

αž“αŸαŸ‡αž‡αžΆαžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αž˜αž€αžŠαž›αŸ‹αž•αŸ’αž“αŸ‚αž€αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž”αŸ†αž•αž»αž:

αžαŸ’αž„αŸƒαž‘αžΈ 3 αžαŸ‚αž’αŸ’αž“αžΌ αž†αŸ’αž“αžΆαŸ† 2018 αŸ”
αž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαžŸαŸ’αžšαžΆαžœαž‡αŸ’αžšαžΆαžœαž‘αŸ…αž›αžΎαžŸαž˜αžαŸ’αžαž—αžΆαž–αžŠαŸ‚αž›αž’αžΆαž…αžšαž€αž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αŸƒαžŸαŸ†αžŽαž½αžš PostgreSQL αŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ„αŸ‡αž‡αžΆαžšαžΏαž„αžαž»αžŸαž‚αŸ’αž“αžΆαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αŸ”

αž“αŸ…β€‹αž˜αžΆαž“β€‹αž‡αžΆβ€‹αž”αž“αŸ’αžβ€‹αž‘αŸ€αžβ€¦

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹