Hauʻoli Pāʻina a i ʻole kekahi mau laina hoʻomanaʻo e pili ana i ka ʻike ʻana i ka hoʻokaʻawale ʻana ma PostgreSQL10

ʻŌlelo mua a pehea i puka mai ai ka manaʻo o ka ʻāpana

Hoʻomaka ka moʻolelo ma ʻaneʻi: Ke hoʻomanaʻo nei ʻoe pehea i hoʻomaka ai. ʻO nā mea a pau no ka manawa mua a hou. Ma hope o ka pau ʻana o nā kumuwaiwai no ka hoʻonui ʻana i ka noi, i kēlā manawa, ua pau ka nīnau - he aha ka mea aʻe? ʻO kēia ke ʻano o ka manaʻo o ka hoʻokaʻawale ʻana.

Hauʻoli Pāʻina a i ʻole kekahi mau laina hoʻomanaʻo e pili ana i ka ʻike ʻana i ka hoʻokaʻawale ʻana ma PostgreSQL10

Hoʻokaʻawale mele:
Pono 'i kēlā manawa', no ka mea e like me ka mea i ʻike ʻia, aia nā waihona hoʻopaʻa ʻole i hoʻohana ʻole ʻia... Mahalo asmm a me Habru!

No laila, pehea e hiki ai iā ʻoe ke hauʻoli i ka mea kūʻai aku, a i ka manawa like e hoʻomaikaʻi ai i kāu mau akamai?

E maʻalahi i nā mea a pau e like me ka hiki, a laila ʻelua mau ala e hoʻomaikaʻi nui ai i kekahi mea i ka hana o ka waihona:
1) Alanui nui - hoʻonui mākou i nā kumuwaiwai, hoʻololi i ka hoʻonohonoho;
2) Ala koʻikoʻi - ka huli ʻana i nā nīnau

No ka mea, ke haʻi hou aku nei au, i kēlā manawa ʻaʻole maopopo hou ka mea e hoʻololi ai i ka noi e wikiwiki, ua koho ʻia ke ala - hoʻololi hoʻolālā papaʻaina.

No laila, kū mai ka nīnau nui: pehea a pehea mākou e hoʻololi ai?

Nā kūlana mua

ʻO ka mea mua, aia kēia ERD (hōʻike ʻia ma ke ʻano maʻalahi maʻalahi):
Hauʻoli Pāʻina a i ʻole kekahi mau laina hoʻomanaʻo e pili ana i ka ʻike ʻana i ka hoʻokaʻawale ʻana ma PostgreSQL10
Nā Kiʻi Nui:

  1. pili nui-a-nui
  2. ua loaʻa i ka papaʻaina kahi kī pākuʻi

Noi kumu:

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' ;

Nā hopena o ka hoʻokō ʻana ma ka waihona hoʻāʻo:
kāki : 502 997.55
Ka manawa hoʻokō: 505 kekona.

He aha kā mākou e ʻike nei? He noi maʻamau, e pili ana i kahi ʻāpana manawa.
E hana kākou i ka manaʻo noʻonoʻo maʻalahi: inā he laʻana o kahi ʻāpana manawa, e kōkua anei ia iā mākou? Pololei - ʻokiʻoki.

He aha ka ʻāpana?

I ka nānā mua ʻana, ʻike ʻia ka koho - ka wehewehe wehewehe ʻana o ka papaʻaina "hoʻouna" me ke kī "SHIPMENT_DATE" (lele loa i mua - i ka hopena ua hewa iki i ka hana).

Pehea e mahele ai?

ʻAʻole paʻakikī loa kēia nīnau. ʻO ka mea pōmaikaʻi, ma PostgreSQL 10, aia i kēia manawa kahi hana hoʻokaʻawale kanaka.
No laila:

  1. E mālama i kahi hoʻolei o ka papa kumu - pg_dump source_table
  2. Holoi i ka papa ʻaina kumu - hoʻokuʻu i ka pākaukau source_table
  3. E hana i papaʻaina makua me ka hoʻokaʻawale ʻana - hoʻokumu i ka papa ʻaina source_table
  4. Hana i nā ʻāpana - hoʻokumu i ka papa ʻaina kumu_table, hana i ka index
  5. Hoʻokomo i ka pahu i hana ʻia ma ka ʻanuʻu 1 - pg_hoʻihoʻi

Nā palapala no ka māhele ʻana

No ka maʻalahi a me ka maʻalahi, ua hoʻohui ʻia nā ʻanuʻu 2,3,4 i hoʻokahi palapala.

No laila:
E mālama i kahi hoʻolei o ka papa kumu

pg_dump postgres --file=/dump/shipment.dmp --format=c --table=shipment --verbose > /dump/shipment.log 2>&1

Holoi i ka papa kumu + E hana i ka papa makua me ka hoʻokaʻawale ʻana + E hana i nā ʻāpana

--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
$$;

Ke lawe mai nei i ka hoolei

pg_restore -d postgres --data-only --format=c --table=shipment --verbose  shipment.dmp > /tmp/data_dump/shipment_restore.log 2>&1

Ke nānā nei i nā hopena hoʻokaʻawale

He aha kā mākou hopena? ʻO ka kikokikona holoʻokoʻa o ka hoʻolālā hoʻokō he nui a ʻoluʻolu, no laila hiki iā ʻoe ke kaupalena iā ʻoe iho i nā helu hope.

Kau

kāki: 502 997.55
Ka manawa hoʻokō: 505 kekona.

Ua lilo

kāki: 77 872.36
Ka manawa hoʻokō: 79 kekona.

He hopena maikaʻi loa. Hoʻemi ʻia ke kumukūʻai a me ka manawa hoʻokō. No laila, ʻo ka hoʻohana ʻana i ka partitioning e hāʻawi i ka hopena i manaʻo ʻia a, ma ka laulā, ʻaʻohe mea kupanaha.

E hauʻoli i ka mea kūʻai

Ua hōʻike ʻia nā hopena hōʻike i ka mea kūʻai aku no ka loiloi. A ma hope o ka nānā ʻana, ua hāʻawi ʻia iā lākou kahi ʻōlelo hoʻoholo i manaʻo ʻole ʻia: "Maikaʻi, e hoʻokaʻawale i ka papa ʻikepili".

ʻAe, akā ua nānā mākou i kahi papaʻaina "hoʻouna" ʻokoʻa loa; ʻaʻole i loaʻa i ka papa "ʻikepili" ke kahua "SHIPMENT_DATE".

ʻAʻohe pilikia, hoʻohui, hoʻololi. ʻO ka mea nui, ʻoluʻolu ka mea kūʻai aku i ka hopena; ʻaʻole koʻikoʻi nā kikoʻī hoʻokō.

ʻO ka hoʻokaʻawale ʻana i ka papa nui "ʻikepili"

Ma keʻano laulā, ʻaʻohe pilikia i kū mai. ʻOiai, ua loli iki ka algorithm partitioning.

Hoʻohui i ke kolamu "SHIPMENT_DATA" i ka papa "ʻikepili".

psql -h хост -U база -d юзер
=> ALTER TABLE data ADD COLUMN "SHIPMENT_DATE" timestamp without time zone ;

E hoʻopiha i nā waiwai o ke kolamu "SHIPMENT_DATA" i ka papa "data" me nā waiwai o ke kolamu o ka inoa like mai ka papa "hoʻouna"

-----------------------------
--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
$$;

E mālama i kahi hoʻolei o ka papa "ʻikepili".

pg_dump postgres --file=/dump/data.dmp --format=c --table=data --verbose > /dump/data.log 2>&1</source

E hana hou i ka papaʻaina "ʻikepili"

--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
$$;

E hoʻouka i ka dump i hana ʻia ma ka ʻanuʻu 3.

pg_restore -h хост -юзер -d база --data-only --format=c --table=data --verbose  data.dmp > data_restore.log 2>&1

E hana i ʻāpana ʻokoʻa no ka ʻikepili kahiko

---------------------------------------------------
--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
$$;

Nā hualoaʻa hope loa:

Kau
kāki: 502 997.55
Ka manawa hoʻokō: 505 kekona.

Ua lilo
kāki: 68 533.70
Ka manawa hoʻokō: 69 kekona

Pono, kūpono loa. A me ka noʻonoʻo ʻana ma ke ala a mākou i hoʻokele ai i ka ʻoi aku a i ʻole ka liʻiliʻi ʻana i ka ʻōnaehana partitioning ma PostgreSQL 10 - kahi hopena maikaʻi loa.

Hoʻopau lyrical

Hiki paha ke hana ʻoi aku ka maikaʻi - ʻAe, hiki iā ʻoe!No ka hana ʻana i kēia, pono ʻoe e hoʻohana i ka MATERIALIZED VIEW.
HĀLU IA 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 ;

Ke kākau hou nei mākou i ka noi:
Nīnau me ka hoʻohana ʻana i ka ʻike materialized

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';

A loaʻa iā mākou kahi hopena ʻē aʻe:
Kau
kāki: 502 997.55
Ka manawa hoʻokō: 505 kekona

Ua lilo
kāki: 42 481.16
Ka manawa hoʻokō: 43 kekona.

ʻOiai, ʻoiaʻiʻo, he hoʻopunipuni kēlā hopena hoʻohiki; pono e hōʻoluʻolu ʻia nā manaʻo. No laila ʻaʻole kōkua nui ka manawa a pau no ka loaʻa ʻana o ka ʻikepili. Akā ma ke ʻano he hoʻokolohua he mea hoihoi loa ia.

ʻOiaʻiʻo, e like me ka mea i ʻike ʻia, mahalo hou asmm a me Habru!- Hiki ke hoʻomaikaʻi hou ʻia ka nīnau.

Ma hope o ka'ōlelo

No laila, māʻona ka mea kūʻai. A ME makemake e lawe pono i ke kūlana.

Hana hou: He aha kāu e hiki ai ke hoʻonui a hoʻonui?

A laila hoʻomanaʻo wau - e nā kāne, ʻaʻohe o mākou nānā ʻana i kā mākou ʻikepili PostgreSQL.

ʻO ka lima ma ka puʻuwai, aia kekahi mau mākaʻikaʻi ma ke ʻano o Cloud Watch ma AWS. Akā he aha ka pōmaikaʻi o kēia nānā ʻana no ka DBA? Ma keʻano laulā, ʻaʻohe mea.

Inā loaʻa iā ʻoe kahi manawa e hana ai i kahi mea pono a hoihoi iā ʻoe iho, ʻaʻole hiki iā ʻoe ke hoʻohana i kēia manawa...
NO KA

Hauʻoli Pāʻina a i ʻole kekahi mau laina hoʻomanaʻo e pili ana i ka ʻike ʻana i ka hoʻokaʻawale ʻana ma PostgreSQL10

ʻO kēia ke ala e hele ai mākou i kahi mea hoihoi loa:

Kekemapa 3, 2018.
Ke hoʻoholo nei e hoʻomaka i ka noiʻi ʻana i nā mea hiki ke nānā i ka hana o nā nīnau PostgreSQL.

Akā, he moʻolelo ʻokoʻa loa kēlā.

E hoʻomau ʻia…

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka