āĻŽā§āĻāĻŦāĻ¨ā§āĻ§ āĻŦāĻž āĻā§āĻāĻžāĻŦā§ āĻŦāĻŋāĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻ§āĻžāĻ°āĻŖāĻžāĻāĻŋ āĻāĻ¸ā§āĻā§
āĻāĻ˛ā§āĻĒāĻāĻŋ āĻāĻāĻžāĻ¨ā§ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ:
āĻ˛āĻŋāĻ°āĻŋāĻā§āĻ¯āĻžāĻ˛ āĻĄāĻŋāĻā§āĻ°ā§āĻļāĻ¨:
āĻ
āĻŦāĻŋāĻāĻ˛ 'āĻ¸ā§āĻ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§', āĻāĻžāĻ°āĻŖ
āĻ¸ā§āĻ¤āĻ°āĻžāĻ, āĻāĻĒāĻ¨āĻŋ āĻā§āĻāĻžāĻŦā§ āĻā§āĻ°āĻžāĻšāĻāĻā§ āĻā§āĻļāĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ āĻāĻŦāĻ āĻāĻāĻ āĻ¸āĻžāĻĨā§ āĻāĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻā§āĻ° āĻĻāĻā§āĻˇāĻ¤āĻž āĻāĻ¨ā§āĻ¨āĻ¤ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨?
āĻ¯āĻ¤āĻāĻž āĻ¸āĻŽā§āĻāĻŦ āĻ¸āĻŦāĻāĻŋāĻā§ āĻ¸āĻšāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻ¤āĻžāĻ°āĻĒāĻ° āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ā§āĻ° āĻāĻ°ā§āĻŽāĻā§āĻˇāĻŽāĻ¤āĻžāĻ¯āĻŧ āĻāĻŋāĻā§ āĻāĻŽā§āĻ˛ āĻāĻ¨ā§āĻ¨āĻ¤āĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĻā§āĻāĻŋ āĻāĻĒāĻžāĻ¯āĻŧ āĻāĻā§:
1) āĻŦāĻŋāĻ¸ā§āĻ¤ā§āĻ¤ āĻĒāĻĨ - āĻāĻŽāĻ°āĻž āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨ āĻŦāĻžāĻĄāĻŧāĻžāĻ, āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻŋ;
2) āĻ¨āĻŋāĻŦāĻŋāĻĄāĻŧ āĻĒāĻĨ - āĻā§āĻ¯ā§āĻ¯āĻŧāĻžāĻ°ā§ āĻ
āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāĻžāĻ¨
āĻ¯ā§āĻšā§āĻ¤ā§, āĻāĻŽāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§āĻ¤ā§āĻ¤āĻŋ āĻāĻ°āĻāĻŋ, āĻ¸ā§āĻ āĻ¸āĻŽāĻ¯āĻŧā§ āĻāĻ¤āĻŋ āĻŦāĻžāĻĄāĻŧāĻžāĻ¨ā§āĻ° āĻ āĻ¨ā§āĻ°ā§āĻ§ā§ āĻāĻ° āĻā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻ¤āĻž āĻāĻ° āĻ¸ā§āĻĒāĻˇā§āĻ āĻāĻŋāĻ˛ āĻ¨āĻž, āĻĒāĻĨāĻāĻŋ āĻŦā§āĻā§ āĻ¨ā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛ - āĻā§āĻŦāĻŋāĻ˛ āĻ¨āĻāĻļāĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĨ¤
āĻ¸ā§āĻ¤āĻ°āĻžāĻ, āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻĒā§āĻ°āĻļā§āĻ¨ āĻāĻ āĻā§: āĻāĻŽāĻ°āĻž āĻā§ āĻāĻŦāĻ āĻā§āĻāĻžāĻŦā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻŦ?
āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻļāĻ°ā§āĻ¤āĻžāĻŦāĻ˛āĻŋ
āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻāĻ ERD āĻāĻā§ (āĻļāĻ°ā§āĻ¤āĻāĻ¤āĻāĻžāĻŦā§ āĻ¸āĻ°āĻ˛ā§āĻā§āĻ¤ āĻāĻĒāĻžāĻ¯āĻŧā§ āĻĻā§āĻāĻžāĻ¨ā§ āĻšāĻ¯āĻŧā§āĻā§):
āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯:
- āĻ āĻ¨ā§āĻ āĻĨā§āĻā§ āĻ āĻ¨ā§āĻ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ
- āĻā§āĻŦāĻŋāĻ˛ā§ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻāĻŋ āĻ¸āĻŽā§āĻāĻžāĻŦā§āĻ¯ āĻĒāĻžāĻ°ā§āĻāĻŋāĻļāĻ¨ āĻā§ āĻ°āĻ¯āĻŧā§āĻā§
āĻŽā§āĻ˛ āĻ āĻ¨ā§āĻ°ā§āĻ§:
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-āĻ, āĻāĻāĻ¨ āĻāĻāĻāĻŋ āĻŽāĻžāĻ¨āĻŦ āĻŦāĻŋāĻāĻžāĻāĻ¨ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ°āĻ¯āĻŧā§āĻā§āĨ¤
āĻ¤āĻžāĻ:
- āĻāĻ¤ā§āĻ¸ āĻā§āĻŦāĻŋāĻ˛ā§āĻ° āĻāĻāĻāĻŋ āĻĄāĻžāĻŽā§āĻĒ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°ā§āĻ¨ - pg_dump source_table
- āĻŽā§āĻ˛ āĻā§āĻŦāĻŋāĻ˛āĻāĻŋ āĻŽā§āĻā§āĻ¨ - āĻĄā§āĻ°āĻĒ āĻā§āĻŦāĻŋāĻ˛ āĻ¸ā§āĻ°ā§āĻ¸_āĻā§āĻŦāĻŋāĻ˛
- āĻ°ā§āĻā§āĻ āĻĒāĻžāĻ°ā§āĻāĻŋāĻļāĻ¨ āĻ¸āĻš āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻ°ā§āĻ¨ā§āĻ āĻā§āĻŦāĻŋāĻ˛ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨ - āĻā§āĻŦāĻŋāĻ˛ āĻ¸ā§āĻ°ā§āĻ¸_āĻā§āĻŦāĻŋāĻ˛ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨
- āĻŦāĻŋāĻāĻžāĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨ - āĻā§āĻŦāĻŋāĻ˛ āĻ¸ā§āĻ°ā§āĻ¸_āĻā§āĻŦāĻ˛ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨, āĻ¸ā§āĻāĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨
- āĻ§āĻžāĻĒ 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 āĻ¸ā§āĻā§āĻ¨ā§āĻĄāĨ¤
āĻ¯āĻĻāĻŋāĻ, āĻ āĻŦāĻļā§āĻ¯āĻ, āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤āĻŋāĻļā§āĻ˛ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻĒā§āĻ°āĻ¤āĻžāĻ°āĻŖāĻžāĻŽā§āĻ˛āĻ; āĻ§āĻžāĻ°āĻŖāĻžāĻā§āĻ˛āĻŋāĻā§ āĻ°āĻŋāĻĢā§āĻ°ā§āĻļ āĻāĻ°āĻž āĻĻāĻ°āĻāĻžāĻ°āĨ¤ āĻ¸ā§āĻ¤āĻ°āĻžāĻ āĻĄā§āĻāĻž āĻā§āĻ°āĻšāĻŖā§āĻ° āĻŽā§āĻ āĻ¸āĻŽāĻ¯āĻŧ āĻā§āĻŦ āĻŦā§āĻļāĻŋ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻāĻ°āĻŦā§ āĻ¨āĻžāĨ¤ āĻ¤āĻŦā§ āĻāĻāĻāĻŋ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻāĻāĻŋ āĻŦā§āĻļ āĻāĻāĻ°ā§āĻˇāĻŖā§āĻ¯āĻŧāĨ¤
āĻāĻ¸āĻ˛ā§, āĻāĻāĻŋ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻšāĻ¯āĻŧā§āĻā§, āĻāĻŦāĻžāĻ° āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ
āĻāĻ¤ā§āĻ¤āĻ°āĻāĻžāĻˇ
āĻ¸ā§āĻ¤āĻ°āĻžāĻ, āĻā§āĻ°āĻžāĻšāĻ āĻ¸āĻ¨ā§āĻ¤ā§āĻˇā§āĻāĨ¤ āĻāĻŦāĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻ¨āĻŋāĻ¨āĨ¤
āĻ¤ā§āĻ¯ā§: āĻāĻĒāĻ¨āĻŋ āĻāĻā§āĻ° āĻāĻŦāĻ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻāĻ°āĻ¤ā§ āĻāĻŋ āĻ¸āĻā§āĻā§ āĻāĻ¸āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨?
āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻĒāĻ°ā§ āĻāĻŽāĻŋ āĻŽāĻ¨ā§ āĻāĻ°āĻŋ - āĻŦāĻ¨ā§āĻ§ā§āĻ°āĻž, āĻāĻŽāĻžāĻĻā§āĻ° āĻĒā§āĻ¸ā§āĻāĻā§āĻ°ā§āĻāĻ¸āĻāĻŋāĻāĻāĻ˛ āĻĄā§āĻāĻžāĻŦā§āĻ¸āĻā§āĻ˛āĻŋāĻ° āĻĒāĻ°ā§āĻ¯āĻŦā§āĻā§āĻˇāĻŖ āĻ¨ā§āĻāĨ¤
āĻšāĻžāĻ°ā§āĻ āĻ āĻ¨ āĻšāĻžāĻ°ā§āĻ, āĻāĻāĻ¨āĻ AWS-āĻ āĻā§āĻ˛āĻžāĻāĻĄ āĻāĻ¯āĻŧāĻžāĻ āĻāĻāĻžāĻ°ā§ āĻāĻŋāĻā§ āĻĒāĻ°ā§āĻ¯āĻŦā§āĻā§āĻˇāĻŖ āĻāĻā§āĨ¤ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻĄāĻŋāĻŦāĻŋāĻāĻ° āĻāĻ āĻŽāĻ¨āĻŋāĻāĻ°āĻŋāĻ āĻāĻ°ā§ āĻ˛āĻžāĻ āĻā§? āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻāĻžāĻŦā§, āĻāĻžāĻ°ā§āĻ¯āĻ¤ āĻā§āĻ¨āĻāĻŋ āĻ¨āĻ¯āĻŧāĨ¤
āĻāĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĻāĻ°āĻāĻžāĻ°ā§ āĻāĻŦāĻ āĻāĻāĻ°ā§āĻˇāĻŖā§āĻ¯āĻŧ āĻāĻŋāĻā§ āĻāĻ°āĻžāĻ° āĻ¸ā§āĻ¯ā§āĻ āĻĨāĻžāĻāĻ˛ā§, āĻāĻĒāĻ¨āĻŋ āĻāĻ āĻ¸ā§āĻ¯ā§āĻā§āĻ° āĻ¸āĻĻā§āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŦā§āĻ¨ āĻ¨āĻž...
āĻāĻ¨ā§āĻ¯
āĻāĻāĻāĻžāĻŦā§ āĻāĻŽāĻ°āĻž āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻāĻāĻ°ā§āĻˇāĻŖā§āĻ¯āĻŧ āĻ
āĻāĻļā§ āĻāĻ¸āĻŋ:
āĻĄāĻŋāĻ¸ā§āĻŽā§āĻŦāĻ° 3, 2018āĨ¤
PostgreSQL āĻĒā§āĻ°āĻļā§āĻ¨ā§āĻ° āĻāĻ°ā§āĻŽāĻā§āĻˇāĻŽāĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻā§āĻˇāĻŖā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ˛āĻŦā§āĻ§ āĻā§āĻˇāĻŽāĻ¤āĻž āĻ¨āĻŋāĻ¯āĻŧā§ āĻāĻŦā§āĻˇāĻŖāĻž āĻļā§āĻ°ā§ āĻāĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨ā§āĻāĻ¯āĻŧāĻžāĨ¤
āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻž āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻāĻŋāĻ¨ā§āĻ¨ āĻāĻ˛ā§āĻĒāĨ¤
āĻāĻ˛āĻŦā§âĻ
āĻāĻ¤ā§āĻ¸: www.habr.com