μλ¬Έ λλ λ¨λ©΄ν μμ΄λμ΄κ° μ΄λ»κ² νμνλμ§
μ΄μΌκΈ°λ μ¬κΈ°μ μμλ©λλ€: κ·Έ λΉμ 쿼리 μ΅μ νλ₯Ό μν κ±°μ λͺ¨λ 리μμ€κ° μμ§λ ν λ€μ μ§λ¬Έμ΄ μκ²Όμ΅λλ€. λ€μμ 무μμ λκΉ? μ΄κ²μ΄ νν°μ λ μμ΄λμ΄κ° λμ¨ λ°©λ²μ λλ€.

μμ μ μΈ νμ :
λ°λ‘ 'κ·Έ μκ°'μ΄λκΉμ. . κ³ λ§μ. κ·Έλ¦¬κ³ νλΈλ£¨!
κ·Έλ λ€λ©΄ κ³ κ°μ ν볡νκ² λ§λλ λμμ μμ μ κΈ°μ λ ν₯μμν¬ μ μλ λ°©λ²μ 무μμΌκΉμ?
λͺ¨λ κ²μ μ΅λν λ¨μννκΈ° μν΄, λ°μ΄ν°λ² μ΄μ€ μ±λ₯μ κ·Όλ³Έμ μΌλ‘ ν₯μμν€λ λ°©λ²μ λ κ°μ§λΏμ
λλ€.
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
- λ²μ νν°μ λμ μ¬μ©νμ¬ μμ ν μ΄λΈ μμ± - ν μ΄λΈ source_table μμ±
- μΉμ λ§λ€κΈ° - ν μ΄λΈ 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 ;"data" ν μ΄λΈμ "SHIPMENT_DATA" μ΄μ κ°μ "shipment" ν μ΄λΈμ λμΌν μ΄λ¦μ μ΄ κ°μΌλ‘ μ±μλλ€.
-----------------------------
--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λΆν λ ν μ΄λΈ 'data'λ₯Ό λ€μ μμ±ν©λλ€.
--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μ νν°μ λ λ©μ»€λμ¦μ μ΄λ μ λ λ§μ€ν°ν μ μμμ΅λλ€. μ΄λ νλ₯ν κ²°κ³Όμ λλ€.
μμ μ μΉ¨λ΅
λ μν μ μλμ? μ, κ°λ₯ν©λλ€!μ΄λ₯Ό μν΄μλ 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.55
μ€ν μκ°: 505 μ΄
κ·Έκ²μλμλ€
λΉμ© : 42 481.16
μ€ν μκ°: 43 μ΄.
λ¬Όλ‘ κ·Έλ¬ν μ λ§ν κ²°κ³Όλ κΈ°λ§μ μ΄μ§λ§ μμ΄λμ΄λ μλ‘μμ§ νμκ° μμ΅λλ€. λ°λΌμ λ°μ΄ν°λ₯Ό μμ νλ λ° κ±Έλ¦¬λ μ΄ μκ°μ λ³λ‘ λμμ΄ λμ§ μμ΅λλ€. κ·Έλ¬λ μ€νμ μΌλ‘λ λ§€μ° ν₯λ―Έλ‘μ΅λλ€.
μ€μ λ‘ κ²°κ³Όμ μΌλ‘ λ€μ ν λ² κ°μ¬λ립λλ€. κ·Έλ¦¬κ³ νλΈλ£¨!-
μ¬ν
κ·Έλμ κ³ κ°μ λ§μ‘±ν©λλ€. κ·Έλ¦¬κ³ νμν μν©μ νμ©νμΈμ.
μ μμ : μ¬ννκ³ νμ₯νκΈ° μν΄ λ¬΄μμ μκ°ν΄ λΌ μ μμ΅λκΉ?
κ·Έλ¦¬κ³ κΈ°μ΅λλ κ²μ, μ°λ¦¬λ PostgreSQL λ°μ΄ν°λ² μ΄μ€λ₯Ό λͺ¨λν°λ§νμ§ μλλ€λ κ²μ λλ€.
μ€μ λ‘ AWSμλ Cloud Watch ννμ λͺ¨λν°λ§μ΄ μ¬μ ν μμ΅λλ€. νμ§λ§ DBAμκ² μ΄λ¬ν λͺ¨λν°λ§μ μ΄μ μ 무μμ λκΉ? μΌλ°μ μΌλ‘ κ±°μ μμ΅λλ€.
μμ μκ² μ μ©νκ³ ν₯λ―Έλ‘μ΄ μΌμ ν μ μλ κΈ°νκ° μλ€λ©΄, μ΄ κΈ°νλ₯Ό νμ©νμ§ μμ μ μμ΅λλ€...
Mbo

μ΄κ²μ΄ μ°λ¦¬κ° κ°μ₯ ν₯λ―Έλ‘μ΄ λΆλΆμ λλ¬νλ λ°©λ²μ
λλ€:
3λ 2018μ XNUMXμΌ.
PostgreSQL 쿼리 μ±λ₯μ λͺ¨λν°λ§νκΈ° μν΄ μ¬μ© κ°λ₯ν κΈ°λ₯μ λν μ°κ΅¬λ₯Ό μμνκΈ°λ‘ κ²°μ ν©λλ€.
κ·Έλ¬λ κ·Έκ²μ μμ ν λ€λ₯Έ μ΄μΌκΈ°μ λλ€.
κ³μβ¦
μΆμ² : habr.com
