EessÔna vÔi kuidas tekkis ideed sektsioonideks jagamisest
Loo algus siit: 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.

LĂŒhiĂŒlevaade:
Just âsellel hetkelâ, kuna . AitĂ€h 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):

Peamised omadused:
- suhted 'paljudele paljudele'
- 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:
- Salvestame algse tabeli koopia â pg_dump source_table
- Kustutame algse tabeli â drop table source_table
- Loome vanematabeli sektsioonimiseks vahemiku alusel â create table source_table
- Loome sektsioonid â create table source_table, create index
- 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>&1Kustutame 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>&1Kontrollime 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<sourceLoomme 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>&1Loome 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 ja Habrule! -
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

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
