Happy Party vÔi paar rida meenutusi PostgreSQL10 sektsioonide tundmaÔppimisest

EessÔna vÔi kuidas tekkis ideed sektsioonideks jagamisest

Loo algus siit: Kas sa mĂ€letad, kuidas kĂ”ik algas? KĂ”ik oli esmakordselt ja taas. PĂ€rast seda, kui peaaegu kĂ”ik ressursid pĂ€ringute optimeerimiseks olid selleks hetkeks ammendatud, tekkis kĂŒsimus — mis edasi? Nii tekkis idee sektsioonideks jagamisest.

Happy Party vÔi paar rida meenutusi PostgreSQL10 sektsioonide tundmaÔppimisest

LĂŒhiĂŒlevaade:
Just ‘sellel hetkel’, kuna nagu selgus, olid veel kasutamata optimeerimise рДзДрĐČid. AitĂ€h asmm ja Habrule!

Nii et, kuidas veel saaks tellijat justkui Ônnelikuks teha, ja samal ajal ka enda oskusi tÔsta?

Kui kÔik ÀÀrmiselt lihtsaks teha, siis on radikaalselt, et midagi andmebaasi jÔudlust parandada, vaid kaks teed:
1) Ekstensiivne tee — suurendame ressursse, muudame konfiguratsiooni;
2) Intensiivne tee — pĂ€ringute optimeerimine

Kuna, kordustan, tol hetkel ei olnud selge, mida veel pĂ€ringus muuta kiirusel kiirusel, valiti tee — tabelite kujunduse muutmine.

Nii et — tekib peamine kĂŒsimus — mida ja kuidas me muudame?

Algtingimused

Esiteks, on olemas selline ERD (kuvatakse tinglikult lihtsustatud):
Happy Party vÔi paar rida meenutusi PostgreSQL10 sektsioonide tundmaÔppimisest
Peamised omadused:

  1. suhted 'paljudele paljudele'
  2. tabel juba omab potentsiaalset partitsioonimise vÔtit

Algne pÀring:

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

TĂ€itev tulemused testandmebaasis:
Kulu : 502 997.55
TĂ€itev aeg: 505 sekundit.

Mida me nÀeme? Tavaline pÀring, ajalise lÔike jÀrgi.
Teeme lihtsa loogilise oletuse: kui on ajaviidete valik, siis aitab see meid? Õige — sektsioonimine.

Mida sektsioneerida?

Esmapilgul tundub valik ilmselge — deklaratiivne sektsioonimine tabelis "shipment" vĂ”tme "SHIPMENT_DATE" alusel (liialdades — lĂ”puks ei saanud produktsioon siiski nii nagu arvati).

Kuidas sektsioneerida?

See kĂŒsimus ei ole ka liiga keeruline. Õnneks on PostgreSQL 10-s nĂŒĂŒd inimlik sektsioonimise mehhanism.
Nii et:

  1. Salvestame algse tabeli koopia — pg_dump source_table
  2. Kustutame algse tabeli — drop table source_table
  3. Loome vanematabeli sektsioonimiseks vahemiku alusel — create table source_table
  4. Loome sektsioonid — create table source_table, create index
  5. Imporitame koopia, mille lĂ”ime 1. sammul — pg_restore

Sektsioonimistooted

Lihtsuse ja mugavuse tĂ”ttu on 2., 3., ja 4. samm ĂŒhendatud ĂŒhes skriptis.

Nii et:
Salvestame algse tabeli koopia

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

Kustutame algse tabeli + Loome vanematabeli sektsioonimiseks vahemiku alusel + Loome sektsioonid

--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 'Loo TEMPORARY TABLE A EGUKSUSEDA';
  CREATE TEMP TABLE tmp_shipment_date as select distinct "SHIPMENT_DATE" from shipment order by "SHIPMENT_DATE" ;

  RAISE NOTICE 'KUSTUTA TABEL 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 'LOO PARTITSIOONID TABELLE 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') = 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
       --UUED piirid ainult teist korda ja hiljem 
       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 ' ) ; 

      --Kustuta esmakordne mÀrk
      first_flag := false ;
   
  END LOOP;

end
$$;

Importimeed dump

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

Kontrollime sektsiooni tulemusi

Millised on meie tulemused? TÀielik tÀitmisplaani tekst on suur ja igav, seega vÔib tÀiesti piirduda lÔplikke numbreid sisaldava kokkuvÔttega.

Oli

Kulu: 502 997.55
TĂ€itmisaeg: 505 sekundi.

Kohandatud

Kulu: 77 872.36
TĂ€itmisaeg: 79 sekundi.

Aeglane tulemus. Oleme vĂ€hendanud kulu ja tĂ€itmise aega. Seega seciooni kasutamine toob oodatud tulemuse ja on ĂŒldiselt — ilma ĂŒllatusteta.

Rahuldada tellijat

Testimise tulemused esitati tellijale vaatamiseks. PĂ€rast tutvumist anti neile mĂ”ned ootamatud lĂ”ppotsused: „SuurepĂ€rane, sektsioneerige tabel „data“.”

Jah, aga me uurisime hoopis teist tabelit „shipment“, tabelil „data“ ei ole vĂ€ljakut „SHIPMENT_DATE“.

Pole probleemi, lisage, muutke. Peamine on, et tellijat rahuldaks see, mis lĂ”puks valmib, teostuse ĂŒksikasjad ei ole eriti olulised.

Sektsioneerime pĂ”hitĂ€valli „data“

Üldiselt ei tekkinud mingeid erilisi raskusi. Kuigi sektsioneerimise algoritm on muidugi veidi muutunud.

Lisame veeru „SHIPMENT_DATA“ tabelisse „data“

psql -h host -U database -d user
=> ALTER TABLE data ADD COLUMN "SHIPMENT_DATE" timestamp without time zone ;

TĂ€idame „SHIPMENT_DATA” veeru vÀÀrtused tabelis „data” sama nimega veeru vÀÀrtustega tabelist „shipment”

-----------------------------
--update_data.sql
-- andmete uuendamine muudetud tabelisse "data" veergude "shipment_data" vÀÀrtustest tabelist "shipment"
--versioon 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 'Kokku %',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 'reaha arv = % , kokku %',row_count,total_rows;
  END LOOP;

end
$$;

Salvestame tabeli „data” dump'i

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

Loomme uuesti jaotustabeli „data”

--create_partition_data.sql
--luua tabeli "wafer data" partitsioone vahemikuga veeru "shipment_data" alusel, mille kestus on ĂŒks kuu
--versioon 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 'LOOD TÄHTAJALISE TABELI KODANIKU KÜLLUGA';
  CREATE TEMP TABLE tmp_shipment_date as select distinct "SHIPMENT_DATE" from shipment order by "SHIPMENT_DATE" ;


  RAISE NOTICE 'KUSTUTA TABEL DATA';
  drop table data cascade ;


  RAISE NOTICE 'LOODA PARTITSIOONITUD TABEL 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 'LOODA PARTITSIOONID TABELILE 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") ; 

      --Alguspiiride algus
      IF   begin_year = '0' THEN
       RAISE NOTICE '***Alguspiiride alguse seadistamine';
       first_flag := true ; --esimese kord tÀiustamine
       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;

      -- Kontrolli praegust kuupÀeva piire jooksul, mitte esmakordsel

      RAISE NOTICE 'Praegused andmed = %',to_char( to_date( current_year||'.'||current_month, 'YYYY.MM'), 'YYYY.MM');
      RAISE NOTICE 'Algusaeg = %',to_char( to_date( begin_year||'.'||begin_month, 'YYYY.MM'), 'YYYY.MM');
      RAISE NOTICE 'JÀrgnev kuupÀev = %',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 '***JATKA';
         CONTINUE ; 
      ELSE
       --Uued piirid ainult teise ja edasise jaoks 
       RAISE NOTICE '***Uued PIIRID';
       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 'PARTITSIOONI NUMBER % , TABELI NIMI =%',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 NIMI =%',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 NIMI =%',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 NIMI =%',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 NIMI =%',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 NIMI =%',index_name;
      EXECUTE format('CREATE INDEX ' || quote_ident(index_name) || ' ON '|| quote_ident(partition_name) ||' USING btree ("SHIPMENT_DATE") TABLESPACE pg_default ' ) ; 

      --Esimese kord tÀiustmine
      first_flag := false ;

  END LOOP;
end
$$;

Kandideerime etapi 3 jooksul loodud dumpi.

pg_restore -h host -user -d database --data-only --format=c --table=data --verbose data.dmp > data_restore.log 2>&1

Loome eraldi sektsiooni vanade andmete jaoks.

---------------------------------------------------
--create_partition_for_old_dates.sql
--partitsioonide loomine vanade kuupÀevade hoidmiseks
--versioon 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 'Vana kuupÀev on %',rec_shipment_date.min_date ;

      partition_name := 'data_old_dates'  ;

      RAISE NOTICE 'PARTITSIOONI NIME ON %',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
$$;

LÔppresults

Oli
Kulu: 502 997.55
TĂ€itev aeg: 505 sekundit.

Kohandatud
Kulu: 68 533.70
TĂ€itmisaeg: 69 sekundit

Auhinnas, tĂ€iesti Ă”igustatud. Arvestades, et teel suudeti enam-vĂ€hem omandada sektsioneerimise mehhanismi PostgreSQL 10-s — suurepĂ€rane tulemus.

LĂŒhiĂŒlevaade

Kas on vĂ”imalik teha veelgi paremini — JAH, ON VÕIMALIK!Selleks tuleb kasutada MATERIALIZED VIEW'i.
CREATE 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;

Kordame taaskord ĂŒleskutset:
PĂ€ring kasutades materialized view'i

VALI
            p."PARAMETER_ID" kui parameter_id,
            pc."PC_NAME" kui pc_name,
            pc."CUSTOMER_PARTNUMBER" kui customer_partnumber,
            w."LASERMARK" kui lasermark,
            w."LOTID" kui lotid,
            w."REPORTED_VALUE" kui reported_value,
            w."LOWER_SPEC_LIMIT" kui lower_spec_limit,
            w."UPPER_SPEC_LIMIT" kui upper_spec_limit,
            p."TYPE_CALCUL" kui type_calcul,
            s."SHIPMENT_NAME" kui shipment_name,
            s."SHIPMENT_DATE" kui shipment_date,
            extract(year from s."SHIPMENT_DATE") kui year,
            extract(month from s."SHIPMENT_DATE") kui month,
            s."REPORT_NAME" kui report_name,
            p."STC_NAME" kui STC_name,
            p."CUSTOMERPARAM_NAME" kui 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';

Ja saame veel ĂŒhe kokkuvĂ”tte:
Oli
Kulu: 502 997.55
TĂ€itev aeg: 505 sekundit

Kohandatud
Kulu: 42 481.16
TĂ€itmisaeg: 43 sekundit.

Kuigi muidugi, nii palju lubav tulemus on petlik, arusaamu tuleb vÀrskendada. Seega lÔpptulemus andmete hankimise osas pole just eriti abistav. Kuid katse jaoks on see pÀris huvitav.

Tegelikult, nagu selgus, tÀnu veelkord asmm ja Habrule! - pÀringut saab veel tÀiustada.

JÀrelsÔna

Nii et tellija on rahul. Ja vaja kasutada olukorda.

Uus ĂŒlesanne: Mida vĂ”iks vĂ€lja mĂ”elda, et sĂŒvendada ja laiendada?

Ja siis meenub — poisid, meil ei ole meie PostgreSQL andmebaaside seiretegit.

KĂ€si sĂŒdamele, mingisugune seire Cloud Watchiga AWS-is tegelikult on. Kuid kui palju kasu on sellest seirest DBA-le? Üldiselt peaaegu mitte midagi.

Kui on vÔimalus teha midagi kasulikku ja huvitavat ka enda jaoks, siis ei saa sellist vÔimalust kasutamata jÀtta 

SEEDEL

Happy Party vÔi paar rida meenutusi PostgreSQL10 sektsioonide tundmaÔppimisest

Nii me jÔudsime kÔige huvitavamani:

3. detsember 2018.
Otsus alustada PostgreSQL pÀringute tulemuslikkuse jÀlgimise vÔimaluste uurimist.

Aga see on juba tĂ€iesti teine ​​lugu.

JĂ€tkub...

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster