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. āĻŽā§‚āĻ˛ āĻŸā§‡āĻŦāĻŋāĻ˛āĻŸāĻŋ āĻŽā§āĻ›ā§āĻ¨ - āĻĄā§āĻ°āĻĒ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¸ā§‹āĻ°ā§āĻ¸_āĻŸā§‡āĻŦāĻŋāĻ˛
  3. āĻ°ā§‡āĻžā§āĻœ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ°ā§‡āĻ¨ā§āĻŸ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ - āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¸ā§‹āĻ°ā§āĻ¸_āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨
  4. āĻŦāĻŋāĻ­āĻžāĻ— āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ - āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¸ā§‹āĻ°ā§āĻ¸_āĻŸā§‡āĻŦāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨, āĻ¸ā§‚āĻšāĻ• āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨
  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
āĻ¸āĻžā§āĻšāĻžāĻ˛āĻ¨ā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ: 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
$$;

āĻ§āĻžāĻĒ 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-āĻ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨āĻŋāĻ‚ āĻŽā§‡āĻ•āĻžāĻ¨āĻŋāĻœāĻŽ āĻ•āĻŽāĻŦā§‡āĻļāĻŋ āĻ†āĻ¯āĻŧāĻ¤ā§āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĒā§‡āĻ°ā§‡āĻ›āĻŋ - āĻāĻ•āĻŸāĻŋ āĻšāĻŽā§ŽāĻ•āĻžāĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛āĨ¤

āĻ˛āĻŋāĻ°āĻŋāĻ•āĻžāĻ˛ āĻĄāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

āĻāĻŸāĻž āĻ•āĻŋ āĻ†āĻ°āĻ“ āĻ­āĻžāĻ˛ āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦ - āĻšā§āĻ¯āĻžāĻ, āĻ†āĻĒāĻ¨āĻŋ āĻĒāĻžāĻ°ā§‡āĻ¨!āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŽā§āĻ¯āĻžāĻŸā§‡āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœāĻĄ āĻ­āĻŋāĻ‰ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤
āĻŽā§āĻ¯āĻžāĻŸā§‡āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœāĻĄ āĻ­āĻŋāĻ‰ 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 āĻāĻŦāĻ‚ āĻšāĻžāĻŦāĻ°ā§!- āĻĒā§āĻ°āĻļā§āĻ¨āĻŸāĻŋ āĻ†āĻ°āĻ“ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ‰āĻ¤ā§āĻ¤āĻ°āĻ­āĻžāĻˇ

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ—ā§āĻ°āĻžāĻšāĻ• āĻ¸āĻ¨ā§āĻ¤ā§āĻˇā§āĻŸāĨ¤ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻ¨āĻŋāĻ¨āĨ¤

āĻ¤ā§āĻ¯ā§‡: āĻ†āĻĒāĻ¨āĻŋ āĻ—āĻ­ā§€āĻ° āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻ•āĻŋ āĻ¸āĻ™ā§āĻ—ā§‡ āĻ†āĻ¸āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨?

āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻ†āĻŽāĻŋ āĻŽāĻ¨ā§‡ āĻ•āĻ°āĻŋ - āĻŦāĻ¨ā§āĻ§ā§āĻ°āĻž, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻĄā§‡āĻŸāĻžāĻŦā§‡āĻ¸āĻ—ā§āĻ˛āĻŋāĻ° āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ āĻ¨ā§‡āĻ‡āĨ¤

āĻšāĻžāĻ°ā§āĻŸ āĻ…āĻ¨ āĻšāĻžāĻ°ā§āĻŸ, āĻāĻ–āĻ¨āĻ“ AWS-āĻ āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻ“āĻ¯āĻŧāĻžāĻš āĻ†āĻ•āĻžāĻ°ā§‡ āĻ•āĻŋāĻ›ā§ āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ āĻ†āĻ›ā§‡āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻĄāĻŋāĻŦāĻŋāĻāĻ° āĻāĻ‡ āĻŽāĻ¨āĻŋāĻŸāĻ°āĻŋāĻ‚ āĻ•āĻ°ā§‡ āĻ˛āĻžāĻ­ āĻ•ā§€? āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ­āĻžāĻŦā§‡, āĻ•āĻžāĻ°ā§āĻ¯āĻ¤ āĻ•ā§‹āĻ¨āĻŸāĻŋ āĻ¨āĻ¯āĻŧāĨ¤

āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻāĻŦāĻ‚ āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻ•āĻŋāĻ›ā§ āĻ•āĻ°āĻžāĻ° āĻ¸ā§āĻ¯ā§‹āĻ— āĻĨāĻžāĻ•āĻ˛ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻāĻ‡ āĻ¸ā§āĻ¯ā§‹āĻ—ā§‡āĻ° āĻ¸āĻĻā§āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž...
āĻœāĻ¨ā§āĻ¯

PostgreSQL10-āĻ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻœāĻžāĻ¨āĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻšā§āĻ¯āĻžāĻĒāĻŋ āĻĒāĻžāĻ°ā§āĻŸāĻŋ āĻŦāĻž āĻ¸ā§āĻŽā§ƒāĻ¤āĻŋāĻ° āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ˛āĻžāĻ‡āĻ¨

āĻāĻ‡āĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻ…āĻ‚āĻļā§‡ āĻ†āĻ¸āĻŋ:

āĻĄāĻŋāĻ¸ā§‡āĻŽā§āĻŦāĻ° 3, 2018āĨ¤
PostgreSQL āĻĒā§āĻ°āĻļā§āĻ¨ā§‡āĻ° āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ¨āĻŋāĻ°ā§€āĻ•ā§āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ—āĻŦā§‡āĻˇāĻŖāĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻžāĨ¤

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻŸāĻž āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ­āĻŋāĻ¨ā§āĻ¨ āĻ—āĻ˛ā§āĻĒāĨ¤

āĻšāĻ˛āĻŦā§‡â€Ļ

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨