"Ingeniarius" — ex Latino translatum — inspiratus significat.
Machinator quidvis potest. (c) R. Diesel.
EPIGRAMMATA.

Aut fabula de cur administrator basis datorum praeteritum suum ut programmator meminisse debeat.
praefatio
Omnia nomina mutata sunt. Quaevis coincidentia fortuita est. Materia solam opinionem personalem auctoris repraesentat.
Exclusio cautionum: Series articulorum designata descriptionem accuratam et accuratam tabularum et scriptorum adhibitorum non continebit. Materia "sicut est" statim adhiberi non poterit.
Primo, propter magnum materiae volumen,
secundo, propter attentionem in basi productionis veri clientis.
Quapropter, articuli solum ideas et descriptiones in forma generalissima continebunt.
Fortasse in futuro systema ad gradum edendi in GitHub crescet, fortasse non. Tempus demonstrabit.
Initium fabulae - "".
Quod exinde accidit, generalissime dictum, est hoc:»
Cur haec omnia mihi opus sunt?
Primum quidem, ne ipse obliviscar, dies gloriosos in otio actos reminiscens.
Deinde, ut quae scripsi ordinem faciam. Quia interdum confundi incipio et quasdam partes oblivisci.
Atque, quod est maximi momenti, fortasse alicui utile erit et adiuvabit ne rotam iterum excogitet et eadem errata repetere velit. Aliis verbis, karma eorum (non Habri) emendabit. Quia res pretiosissima in hoc mundo sunt ideae. Res principalis est ideam invenire. Et eam in rem convertere res est pure technica.
Itaque, paulatim incipiamus...
Enuntiatio problematis.
Praesto:
Basis datorum PostgreSQL (10.5), onus mixtum (OLTP+DSS), onus mediocriter humile, in nube AWS sita.
Nulla vigilantia datorum fit; vigilantia infrastructurae per instrumenta AWS ordinaria, configuratione minima, praebetur.
exigit:
Perfunctionem et salutem basis datorum observa, informationes initiales ad interrogationes basis datorum graves optimizandas inveni et habe.
Brevis introductio vel analysis optionum solutionum
Initio, conemur solutiones possibiles problematis ex prospectu analysis comparativae commodorum et incommodorum pro ingeniario analysare, dum ii qui ad gregem administrationis assignati sunt commoda et incommoda tractabunt.
Optio 1 - "Opus ex necessitate"
Omnia sicut sunt relinquemus. Si emptor ulla parte functionis datorum vel applicationis non contentus erit, ingeniarios DBA per inscriptionem electronicam vel incidentem in systemate tesserarum creando certiores faciet.
Machinator, nuntio accepto, aut problema investigabit, solutionem offeret, aut problema in posterum differet, sperans omnia sponte compositum iri, et nihilominus, omnia mox oblivisci.
Panis zingiberis et crustula, livores et tuberaPanis zingiberis et crustula:
1. Nihil extra facere necesse est.
2. Semper est occasio excusationes inveniendi et defugiendi.
3. Multum temporis ad libet expendendum.
Livores et tubera:
1. Cito aut serius, cliens essentiam existentiae et iustitiam universalem in hoc mundo meditabitur et iterum se interrogabit: quid eis pro eo pecuniam do? Consequentia semper eadem est: tantum temporis quaestio est antequam cliens taedio afficiatur et desistat. Et alveus vacuatur. Triste est.
2. Progressus ingeniarii nullus est.
3. Difficultates in opere disponendo et onerando
Optio II - "Saltatio cum tympanis, venditio et calceamenta"
Punctum VCur systema monitorium nobis opus est? Omnia per interrogationes obtinebimus. Multas interrogationes contra dictionarium datorum et prospectus dynamicos ago, omne genus numeratorum activo, omnia in tabulis summatim compono, et periodica indicia et tabulas analyzo. Resultatum sunt graphia, tabulae, relationes, pulchrae vel minus pulchrae. Res primaria est quam plurimas habere.
Punctum V- Actionem generamus - analysin horum omnium incipimus.
Punctum V- Documentum quoddam paramus, quod simpliciter appellamus - "quomodo basim datorum ordinare".
Punctum VCliens, haec omnia magnifica graphica et figuras videns, puerili et simplici fiducia impletur: nunc omnia mox recte erunt. Itaque facile et sine dolore pecunias suas relinquit. Administratio quoque confidit: nostri artifices egregie funguntur. Onus laboris ad summum pervenit.
Punctum VPunctum 1 regulariter itera.
Panis zingiberis et crustula, livores et tuberaPanis zingiberis et crustula:
1. Vitae administratorum et ingeniariorum simplex, praedicabilis, et plena activitatis sunt. Omnia fremunt, omnes occupati sunt.
2. Vita clientis quoque non mala est—semper certus est se paulisper patientem esse debere et omnia prospere eventura esse. Si non, bene, id solum mundus iniquus est; in altera vita felix erit.
Livores et tubera:
1. Citius aut serius, efficacior praebitor similis servitii apparebit, idem servitium paulo minore pretio offerens. Quod si idem est eventus, cur plus solvendum est? Quod, iterum, ad evanescentiam currus iucundi ducet.
2. Taediosum est. Tam taediosum quam quaevis actio quae sensu caret.
3. Ut in optione priori, nullus progressus est. Sed ingeniario, incommodum est, dissimiliter optioni priori, IDB perpetuo generare necesse esse. Et hoc tempus requirit, quod utiliter impendi posset. Nam nisi tibi ipsi prospicias, nemo de te curat.
Optio III: Non opus est rotam denuo invenire, tantum eam emere et vehi debes.
Est causa cur ingeniarii apud alias societates pizzam edant et eam cerevisia bibant (ah, gloriosa illa Petropolis annis nonagesimis). Utamur systematibus monitoriis quae constructa, emendata, et operativa sunt, et quae plerumque utilia sunt (saltem creatoribus suis).
Panis zingiberis et crustula, livores et tuberaPanis zingiberis et crustula:
1. Noli tempus perdere aliquid iam inventum reinvenire. Accipe et utere.
2. Systema monitoria a stultis non scripta sunt et certe utilia sunt.
3. Systema monitoria operantia plerumque informationem percolatam utilem praebent.
Livores et tubera:
1. Ingeniarius in hoc casu non est ingeniarius, sed tantummodo usor producti alterius. Vel usor.
2. Clienti persuasum esse oportet de necessitate emendi aliquid quod intellegere nolit, nec debeat, et sumptus annuus constitutus est nec mutabitur. Deinde, res dedicata assignanda et ad systema specificum accommodanda est. Ergo, primum solvere, solvere, et iterum solvere oportet. Et cliens parcus est. Haec est norma.
Quid agamus, Chernyshevsky? Quaestio tua satis apta est. (c)
In hoc casu particulari et in praesenti statu rerum, paulo aliter agere potes - Systema nostrum monitorium faciamus.

Non systema sensu pleno verbi, scilicet — verbum nimis vehemens et arrogans est — sed saltem laborem tuum paulo faciliorem redde et plura collige ad problemata perfunctionis solvenda. Ita non in condicionem incidas ubi "aliquo ire, aliquid invenire, nescio quid" debeas.
Quae sunt commoda et incommoda huius optionis:
pros,
1. Interest. Bene, saltem interestingius quam constans "shrink datafile, mute tablespace, etc."
2. Hae sunt novae artes et nova progressio. Quae, citius aut serius, merita praemia afferent.
cons:
1. Laborandum tibi erit. Multum labora.
2. Significationem et prospectus omnium actionum tibi regulariter explicare oportebit.
3. Aliquid sacrificandum erit, quia sola opes ingeniario praesto — tempus — ab Universo circumscribuntur.
4. Pessimum et molestissimum — proinde, fortasse aliquid simile "Non mus, non rana, sed animal ignotum" accipies.
Qui pericula non suscipit, vinum spumantem non bibit.
Itaque pars maxime iucunda incipit.
Idea generalis schematica est.

(Exemplum ex articulo sumptum est. «»)
explicandum:
- Extensio PostgreSQL ordinaria "pg_stat_statements" in basi datorum destinata installatur.
- In basi datorum monitoriae, seriem tabularum servitiorum creamus ad historiam `pg_stat_statements` in stadio initiali servandam et ad mensuras et monitoriam in futuro configurandas.
- In computatro monitorio, seriem scriptorum bash creamus, incluso uno ad incidentes in systemate tesserarum generandos.
Mensae ministerii
Primo, ecce schema simplificatum ERD, quod demonstras quid tandem consecuti simus:

Brevis descriptio tabularumendpoint — hospes, punctum connexionis ad instantiam
Database — parametri datorum
pg_stat_history — tabula historica ad imagines temporales visionis `pg_stat_statements` basis datorum destinatae conservandas
glossarium_metricum — dictionarium mensurarum perfunctionis
configuratio_metrica — configuratio singularum mensurarum
quod metrica illa — mensura specifica pro petitione quae monitoratur
historia_monitionum_metricarum — historia admonitionum de effectu
log_query — tabula utilitaria ad inscriptiones ex fasciculo diarii PostgreSQL ex AWS recepto resolvendas
basi collocantur — parametri temporis ut basis adhibiti
LAPIS — configuratio mensurarum ad sanitatem basis datorum examinandam
historia_monitionum_punctorum_examinationum — historia monitionum de metricis probationis sanitatis basis datorum
pg_stat_db_queries — tabula servitii interrogationum activarum
diarium_actionum — tabula servitii diarii actionum
trap_oid — tabula servitii configurationis captionum
Gradus 1: Statisticas effectuum collige et relationes genera
Tabula ad informationem statisticam conservandam adhibetur. pg_stat_history
Structura tabulae `pg_stat_history`
Tabula "public.pg_stat_history" Columna | Typus | Modificatores ---------------------+----------------------------+------------------------------------------- id | integer | non nullus default nextval('pg_stat_history_id_seq'::regclass) snapshot_timestamp | timestamp sine zona temporali | database_id | integer | dbid | oid | userid | oid | queryid | bigint | query | text | calls | bigint | total_time | double precision | min_time | double precision | max_time | double precision | mean_time | double precision | stddev_time | double precision | rows | bigint | shared_blks_hit | bigint | shared_blks_read | bigint | shared_blks_dirtied | bigint | shared_blks_written | bigint | local_blks_hit | bigint | local_blks_read | bigint | local_blks_dirtied | bigint | local_blks_written | bigint | temp_blks_read | bigint | temp_blks_written | integer | blk_read_time | dupla praecisione | blk_write_time | dupla praecisione | baseline_id | integer | Indices: "pg_stat_history_pkey" CLAVIS PRIMARIA, btree (id) "database_idx" btree (database_id) "queryid_idx" btree (queryid) "snapshot_timestamp_idx" btree (snapshot_timestamp) Claves externae restrictiones: "database_id_fk" CLAVIS EXTERNA (database_id) REFERENTIAS database(id) IN DELETIONE CASCADAUt videre potes, tabula tantum est conspectus cumulativus datorum. pg_stat_statements in basi datorum destinata.
Hac tabula uti facillimum est.
pg_stat_history Statisticas accumulatas exsecutionis interrogationum pro singulis horis repraesentabit. Initio cuiusque horae, postquam tabula impleta est, statisticae... pg_stat_statements restituere cum `pg_stat_statements_reset()`.
Note: Statisticae colliguntur pro interrogationibus quae plus quam unum secundum ad exsequendum requirunt.
Tabellam pg_stat_history implendo
--pg_stat_history.sql
CREATE OR REPLACE FUNCTION pg_stat_history( ) RETURNS boolean AS $$
DECLARE
endpoint_rec record ;
database_rec record ;
pg_stat_snapshot record ;
current_snapshot_timestamp timestamp without time zone;
BEGIN
current_snapshot_timestamp = date_trunc('minute',now());
FOR endpoint_rec IN SELECT * FROM endpoint
LOOP
FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id
LOOP
RAISE NOTICE 'NEW SHAPSHOT IS CREATING';
--Connect to the target DB
EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||endpoint_rec.host||' dbname='||database_rec.name||' user=USER password=PASSWORD '')';
RAISE NOTICE 'host % and dbname % ',endpoint_rec.host,database_rec.name;
RAISE NOTICE 'Creating snapshot of pg_stat_statements for database %',database_rec.name;
SELECT
*
INTO
pg_stat_snapshot
FROM dblink('LINK1',
'SELECT
dbid , SUM(calls),SUM(total_time),SUM(rows) ,SUM(shared_blks_hit) ,SUM(shared_blks_read) ,SUM(shared_blks_dirtied) ,SUM(shared_blks_written) ,
SUM(local_blks_hit) , SUM(local_blks_read) , SUM(local_blks_dirtied) , SUM(local_blks_written) , SUM(temp_blks_read) , SUM(temp_blks_written) , SUM(blk_read_time) , SUM(blk_write_time)
FROM pg_stat_statements WHERE dbid=(SELECT oid from pg_database where datname=current_database() )
GROUP BY dbid
'
)
AS t
( dbid oid , calls bigint ,
total_time double precision ,
rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written bigint ,
local_blks_hit bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,
temp_blks_read bigint ,temp_blks_written bigint ,
blk_read_time double precision , blk_write_time double precision
);
INSERT INTO pg_stat_history
(
snapshot_timestamp ,database_id ,
dbid , calls ,total_time ,
rows ,shared_blks_hit ,shared_blks_read ,shared_blks_dirtied ,shared_blks_written ,local_blks_hit ,
local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written,
blk_read_time, blk_write_time
)
VALUES
(
current_snapshot_timestamp ,
database_rec.id ,
pg_stat_snapshot.dbid ,pg_stat_snapshot.calls,
pg_stat_snapshot.total_time,
pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written ,
pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written ,
pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time
);
RAISE NOTICE 'Creating snapshot of pg_stat_statements for queries with min_time more than 1000ms';
FOR pg_stat_snapshot IN
--All queries with max_time greater than 1000 ms
SELECT
*
FROM dblink('LINK1',
'SELECT
dbid , userid ,queryid,query,calls,total_time,min_time ,max_time,mean_time, stddev_time ,rows ,shared_blks_hit ,
shared_blks_read ,shared_blks_dirtied ,shared_blks_written ,
local_blks_hit , local_blks_read , local_blks_dirtied ,
local_blks_written , temp_blks_read , temp_blks_written , blk_read_time ,
blk_write_time
FROM pg_stat_statements
WHERE dbid=(SELECT oid from pg_database where datname=current_database() AND min_time >= 1000 )
'
)
AS t
( dbid oid , userid oid , queryid bigint ,query text , calls bigint ,
total_time double precision ,min_time double precision ,max_time double precision , mean_time double precision , stddev_time double precision ,
rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written bigint ,
local_blks_hit bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,
temp_blks_read bigint ,temp_blks_written bigint ,
blk_read_time double precision , blk_write_time double precision
)
LOOP
INSERT INTO pg_stat_history
(
snapshot_timestamp ,database_id ,
dbid ,userid , queryid , query , calls ,total_time ,min_time ,max_time ,mean_time ,stddev_time ,
rows ,shared_blks_hit ,shared_blks_read ,shared_blks_dirtied ,shared_blks_written ,local_blks_hit ,
local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written,
blk_read_time, blk_write_time
)
VALUES
(
current_snapshot_timestamp ,
database_rec.id ,
pg_stat_snapshot.dbid ,pg_stat_snapshot.userid ,pg_stat_snapshot.queryid,pg_stat_snapshot.query,pg_stat_snapshot.calls,
pg_stat_snapshot.total_time,pg_stat_snapshot.min_time ,pg_stat_snapshot.max_time,pg_stat_snapshot.mean_time, pg_stat_snapshot.stddev_time ,
pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written ,
pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written ,
pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time
);
END LOOP;
PERFORM dblink_disconnect('LINK1');
END LOOP ;--FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id
END LOOP;
RETURN TRUE;
END
$$ LANGUAGE plpgsql;Propterea, post aliquod tempus in tabula pg_stat_history habebimus seriem imaginum contentorum tabulae pg_stat_statements basis datorum destinata.
Relatio ipsa
Simplicibus interrogationibus utens, relationes satis utiles et iucundas consequi potes.
Data aggregata pro dato tempore
inquisitionis
SELECT
database_id ,
SUM(calls) AS calls ,SUM(total_time) AS total_time ,
SUM(rows) AS rows , SUM(shared_blks_hit) AS shared_blks_hit,
SUM(shared_blks_read) AS shared_blks_read ,
SUM(shared_blks_dirtied) AS shared_blks_dirtied,
SUM(shared_blks_written) AS shared_blks_written ,
SUM(local_blks_hit) AS local_blks_hit ,
SUM(local_blks_read) AS local_blks_read ,
SUM(local_blks_dirtied) AS local_blks_dirtied ,
SUM(local_blks_written) AS local_blks_written,
SUM(temp_blks_read) AS temp_blks_read,
SUM(temp_blks_written) temp_blks_written ,
SUM(blk_read_time) AS blk_read_time ,
SUM(blk_write_time) AS blk_write_time
FROM
pg_stat_history
WHERE
queryid IS NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY database_id ;Tempus DB
`to_char(intervallum '1 millisecundum' * pg_total_stat_history_rec.total_time, 'HH24:MI:SS.MS')`
Tempus I/O
`to_char(intervallum '1 millisecundum' * (pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time), 'HH24:MI:SS.MS')`
Decem optimae SQL secundum tempus_totale
inquisitionis
SELECT
queryid ,
SUM(calls) AS calls ,
SUM(total_time) AS total_time
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY queryid
ORDER BY 3 DESC
LIMIT 10----------------------------------------------------------------------- | DECEM SQL SUMMI PRO TEMPORE EXECUTIONIS TOTALI | #| id_interrogationis | vocationes | vocationes % | tempus_totale (ms) | tempus_database % +----+-----------+-----------+-----------+--------------------------------+----------- | 1| 821760255| 2| .00001|00:03:23.141( 203141.681 ms.)| 5.42 | 2| 4152624390| 2| .00001|00:03:13.929( 193929.215 ms.)| 5.17 | 3| 1484454471| 4| .00001|00:02:09.129( 129129.057 ms.)| 3.44 | 4| 655729273| 1| .00000|00:02:01.869 (121869.981 ms.)| 3.25 | 5| 2460318461| 1| .00000|00:01:33.113 (93113.835 ms.)| 2.48 | 6| 2194493487| 4| .00001|00:00:17.377 (17377.868 ms.)| .46 | 7| 1053044345| 1| .00000|00:00:06.156 (6156.352 ms.)| .16 | 8| (Nota: Numerus numericus incompletus vel ... 3644780286| 1| .00000|00:00:01.063( 1063.830 ms.)| .03
Decem optimae SQL secundum tempus I/O totale
inquisitionis
SELECT
queryid ,
SUM(calls) AS calls ,
SUM(blk_read_time + blk_write_time) AS io_time
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY queryid
ORDER BY 3 DESC
LIMIT 10------------------------------------------------------------------------ | DECEM SQL SUMMI PRO TEMPORE I/O TOTALI | #| id interrogationis | vocationes | vocationes % | tempus I/O (ms) | db tempus I/O % +----+-----------+-----------+-----------+-------------------------+------------ | 1 | 4152624390 | 2 | .00001 | 00:08:31.616 ( 511616.592 ms.) | 31.06 | 2 | 821760255 | 2 | .00001 | 00:08:27.099 ( 507099.036 ms.) | 30.78 | 3 | 655729273 | 1 | .00000 | 00:05:02.209 ( 302209.137 ms.) | 18.35 | 4 | 2460318461 | 1 | 0,00000 | 00:04:05.981 (245981.117 ms.) | 14.93 | 5 | 1484454471 | 4 | 0,00001 | 00:00:39.144 (39144.221 ms.) | 2.38 | 6 | 2194493487 | 4 | 0,00001 | 00:00:18.182 (18182.816 ms.) | 1.10 | 7 | 1053044345 | 1 | 0,00000 | 00:00:16.611 (16611.722 ms.) | 1.01 | (Nota: Numerus repetitionum repetitionum non repetitur.) 8| 3644780286| 1| .00000|00:00:00.436( 436.205 ms.)| .03
Decem optimi SQL secundum maximum tempus executionis
inquisitionis
SELECT
id AS snapshotid ,
queryid ,
snapshot_timestamp ,
max_time
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 4 DESC
LIMIT 10------------------------------------------------------------------------- | DECEM OPTIMI SQL PRO TEMPORE EXECUTIONIS MAXIMO | #| imaginem| imaginemID| interrogationemID| tempus_max (ms) +----+------------------+-----------+-----------+----------------------------------------- | 1| 04/05/2019 01:03| 4169| 655729273| 00:02:01.869( 121869.981 ms.) | 2| 04/04/2019 17:00| 4153| 821760255| 00:01:41.570( 101570.841 ms.) | 3| 04/04/2019 16:00| 4146| 821760255| 00:01:41.570 (101570.841 ms.) | 4 | 04/04/2019 16:00 | 4144 | 4152624390 | 00:01:36.964 (96964.607 ms.) | 5 | 04/04/2019 17:00 | 4151 | 4152624390 | 00:01:36.964 (96964.607 ms.) | 6 | 04/05/2019 10:00 | 4188 | 1484454471 | 00:01:33.452 (93452.150 ms.) | 7 | (Nota: Numerus errorum repetitus est, sed non repetitus est.) 04/04/2019 17:00| 4150| 2460318461| 00:01:33.113(93113.835 ms.) | 8| 04/04/2019 15:00| 4140| 1484454471| 00:00:11.892(11892.302 ms.) | 9| 04/04/2019 16:00| 4145| 1484454471| 00:00:11.892(11892.302 ms.) | 10| 04/04/2019 17:00| 4152| 1484454471| 00:00:11.892 (11892.302 ms.)
TOP10 SQL per lectionem/scripturam bufferis SHARED
inquisitionis
SELECT
id AS snapshotid ,
queryid ,
snapshot_timestamp ,
shared_blks_read ,
shared_blks_written
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
( shared_blks_read > 0 OR shared_blks_written > 0 )
ORDER BY 4 DESC , 5 DESC
LIMIT 10------------------------------------------------------------------------------- | DECEM PRIMI SQL PER LECTURAM/SCRIPTURAM BUFFERI COMMUNIS | #| imago| imagoID| interrogationisID| frusta communia lectio| frusta communia scripti +----+-------------------+-----------+----------+----------------------+--------------------- | 1| 04/04/2019 17:00| 4153| 821760255| 797308| 0 | 2| 04/04/2019 16:00| 4146| 821760255| 797308| 0 | 3| 04/05/2019 01:03| 4169| 655729273| 797158| 0 | 4| 04.04.2019 16:00| 4144| 4152624390| 756514| 0 | 5| 04.04.2019 17:00| 4151| 4152624390| 756514| 0 | 6| 04.04.2019 17:00| 4150| 2460318461| 734117| 0 | 7| 04.04.2019 17:00| 4155| 3644780286| 52973| 0 | 8| 05.04.2019 01:03| 4168| 1053044345| 52818| 0 | 9| 04.04.2019 15:00| 4141| 2194493487| 52813| 0 | 10| 04.04.2019 16:00| 4147| 2194493487| 52813| 0 --------------------------------------------------------------------------------------------
Histogramma distributionis interrogationum secundum tempus exsecutionis maximum
petitiones
SELECT
MIN(max_time) AS hist_min ,
MAX(max_time) AS hist_max ,
(( MAX(max_time) - MIN(min_time) ) / hist_columns ) as hist_width
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT ;
SELECT
SUM(calls) AS calls
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id =DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
( max_time >= hist_current_min AND max_time < hist_current_max ) ;
|-------------------------------------------------------------------------------- | HISTOGRAMMA MAX_TEMPUS | SUMMA VOCATIORUM: 33851920 | TEMPUS MINIMUM: 00:00:01.063 | TEMPUS MAXIMUM: 00:02:01.869 --------------------------------------------------------------------------------- | duratio minima | duratio maxima | vocationes +----------------------------------+----------------------------------+---------- | 00:00:01.063 (1063.830 ms.) | 00:00:13.144 (13144.445 ms.) | 9 | 00:00:13.144 (13144.445 ms.) | 00:00:25.225 (25225.060 ms.) | 0 | 00:00:25.225 (25225.060 ms.) | 00:00:37.305 (37305.675 ms) | 0 | 00:00:37.305 (37305.675 ms) | 00:00:49.386 (49386.290 ms) | 0 | 00:00:49.386 (49386.290 ms) | 00:01:01.466 (61466.906 ms) | 0 | 00:01:01.466 (61466.906 ms) | 00:01:13.547 (73547.521 ms) | 0 | 00:01:13.547 (73547.521 ms) | (Nota: Numerus temporum repetitorum hic sine contextu est.) 00:01:25.628 (85628.136 ms) | 0 | 00:01:25.628 (85628.136 ms) | 00:01:37.708 (97708.751 ms) | 4 | 00:01:37.708 (97708.751 ms) | 00:01:49.789 (109789.366 ms) | 2 | 00:01:49.789 (109789.366 ms) | 00:02:01.869 (121869.981 ms) | 0
Decem Imagines Praecipuae per Quaestionem per Secundum
petitiones
--pg_qps.sql
--Calculate Query Per Second
CREATE OR REPLACE FUNCTION pg_qps( pg_stat_history_id integer ) RETURNS double precision AS $$
DECLARE
pg_stat_history_rec record ;
prev_pg_stat_history_id integer ;
prev_pg_stat_history_rec record;
total_seconds double precision ;
result double precision;
BEGIN
result = 0 ;
SELECT *
INTO pg_stat_history_rec
FROM
pg_stat_history
WHERE id = pg_stat_history_id ;
IF pg_stat_history_rec.snapshot_timestamp IS NULL
THEN
RAISE EXCEPTION 'ERROR - Not found pg_stat_history for id = %',pg_stat_history_id;
END IF ;
--RAISE NOTICE 'pg_stat_history_id = % , snapshot_timestamp = %', pg_stat_history_id ,
pg_stat_history_rec.snapshot_timestamp ;
SELECT
MAX(id)
INTO
prev_pg_stat_history_id
FROM
pg_stat_history
WHERE
database_id = pg_stat_history_rec.database_id AND
queryid IS NULL AND
id < pg_stat_history_rec.id ;
IF prev_pg_stat_history_id IS NULL
THEN
RAISE NOTICE 'Not found previous pg_stat_history shapshot for id = %',pg_stat_history_id;
RETURN NULL ;
END IF;
SELECT *
INTO prev_pg_stat_history_rec
FROM
pg_stat_history
WHERE id = prev_pg_stat_history_id ;
--RAISE NOTICE 'prev_pg_stat_history_id = % , prev_snapshot_timestamp = %', prev_pg_stat_history_id , prev_pg_stat_history_rec.snapshot_timestamp ;
total_seconds = extract(epoch from ( pg_stat_history_rec.snapshot_timestamp - prev_pg_stat_history_rec.snapshot_timestamp ));
--RAISE NOTICE 'total_seconds = % ', total_seconds ;
--RAISE NOTICE 'calls = % ', pg_stat_history_rec.calls ;
IF total_seconds > 0
THEN
result = pg_stat_history_rec.calls / total_seconds ;
ELSE
result = 0 ;
END IF;
RETURN result ;
END
$$ LANGUAGE plpgsql;
SELECT
id ,
snapshot_timestamp ,
calls ,
total_time ,
( select pg_qps( id )) AS QPS ,
blk_read_time ,
blk_write_time
FROM
pg_stat_history
WHERE
queryid IS NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
( select pg_qps( id )) IS NOT NULL
ORDER BY 5 DESC
LIMIT 10
|------------------------------------------------------------------------------------------------ | Decem imagines instantes secundum numeros QueryPerSeconds ordinatae ------------------------------------------------------------------------------------------------------------------------------- | #| imago instantis| imago instantisID| vocationes| tempus database totum| QPS| tempus I/O| tempus I/O % +-----+-----------+-----------+-------------------+-----------+-------------------+------------ | 1| 04/04/2019 20:04| 4161| 5758631| 00:06:30.513( 390513.926 ms.)| 1573.396| 00:00:01.470( 1470.110 ms.)| .376 | 2| 04/04/2019 17:00| 4149| 3529197| 00:11:48.830 (708830.618 ms.) | 980.332 | 00:12:47.834 (767834.052 ms.) | 108.324 | 3 | 04/04/2019 16:00 | 4143 | 3525360 | 00:10:13.492 (613492.351 ms.) | 979.267 | 00:08:41.396 (521396.555 ms.) | 84.988 | 4 | 04/04/2019 21:03 | 4163 | 2781536 | (Nota: Numerus numericus hic sine contextu est et non potest accurate transferri.) 00:03:06.470 (186470.979 ms.) | 785.745 | 00:00:00.249 (249.865 ms.) | 0.134 | 5 | 04.04.2019 19:03 | 4159 | 2890362 | 00:03:16.784 (196784.755 ms.) | 776.979 | 00:00:01.441 (1441.386 ms.) | 0.732 | 6 | 04/04/2019 14:00 | 4137 | 2397326 | 00:04:43.033 (283033.854 ms.) | (Nota: Numerus errorum non requiritur ad accurate transferendum.) 665.924| 00:00:00.024 (24.505 ms.)| 0.009 | 7| 04/04/2019 15:00| 4139| 2394416| 00:04:51.435 (291435.010 ms.)| 665.116| 00:00:12.025 (12025.895 ms.)| 4.126 | 8| 04/04/2019 13:00| 4135| 2373043| 00:04:26.791 (266791.988 ms.)| 659.179| 00:00:00.064 (64.261 ms.)| 0.024 | 9 | 04/05/2019 01:03 | 4167 | 4387191 | 00:06:51.380 (411380.293 ms.)| 609.332 | 00:05:18.847 (318847.407 ms.)| 77.507 | 10 | 04/04/2019 18:01 | 4157 | 1145596 | 00:01:19.217 (79217.372 ms.)| 313.004 | 00:00:01.319 (1319.676 ms.)| (Nota: Numerus errorum non repetitur.) 1.666
Historia Executionis Horaria cum QueryPerSeconds et Tempore I/O
inquisitionis
SELECT
id ,
snapshot_timestamp ,
calls ,
total_time ,
( select pg_qps( id )) AS QPS ,
blk_read_time ,
blk_write_time
FROM
pg_stat_history
WHERE
queryid IS NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 2
|----------------------------------------------------------------------------------------------- | HOURLY EXECUTION HISTORY WITH QueryPerSeconds and I/O Time ----------------------------------------------------------------------------------------------------------------------------------------------- | QUERY PER SECOND HISTORY | #| snapshot| snapshotID| calls| total dbtime| QPS| I/O time| I/O time % +-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+----------- | 1| 04.04.2019 11:00| 4131| 3747| 00:00:00.835( 835.374 ms.)| 1.041| 00:00:00.000( .000 ms.)| .000 | 2| 04.04.2019 12:00| 4133| 1002722| 00:01:52.419( 112419.376 ms.)| 278.534| 00:00:00.149( 149.105 ms.)| .133 | 3| 04.04.2019 13:00| 4135| 2373043| 00:04:26.791( 266791.988 ms.)| 659.179| 00:00:00.064( 64.261 ms.)| .024 | 4| 04.04.2019 14:00| 4137| 2397326| 00:04:43.033( 283033.854 ms.)| 665.924| 00:00:00.024( 24.505 ms.)| .009 | 5| 04.04.2019 15:00| 4139| 2394416| 00:04:51.435( 291435.010 ms.)| 665.116| 00:00:12.025( 12025.895 ms.)| 4.126 | 6| 04.04.2019 16:00| 4143| 3525360| 00:10:13.492( 613492.351 ms.)| 979.267| 00:08:41.396( 521396.555 ms.)| 84.988 | 7| 04.04.2019 17:00| 4149| 3529197| 00:11:48.830( 708830.618 ms.)| 980.332| 00:12:47.834( 767834.052 ms.)| 108.324 | 8| 04.04.2019 18:01| 4157| 1145596| 00:01:19.217( 79217.372 ms.)| 313.004| 00:00:01.319( 1319.676 ms.)| 1.666 | 9| 04.04.2019 19:03| 4159| 2890362| 00:03:16.784( 196784.755 ms.)| 776.979| 00:00:01.441( 1441.386 ms.)| .732 | 10| 04.04.2019 20:04| 4161| 5758631| 00:06:30.513( 390513.926 ms.)| 1573.396| 00:00:01.470( 1470.110 ms.)| .376 | 11| 04.04.2019 21:03| 4163| 2781536| 00:03:06.470( 186470.979 ms.)| 785.745| 00:00:00.249( 249.865 ms.)| .134 | 12| 04.04.2019 23:03| 4165| 1443155| 00:01:34.467( 94467.539 ms.)| 200.438| 00:00:00.015( 15.287 ms.)| .016 | 13| 05.04.2019 01:03| 4167| 4387191| 00:06:51.380( 411380.293 ms.)| 609.332| 00:05:18.847( 318847.407 ms.)| 77.507 | 14| 05.04.2019 02:03| 4171| 189852| 00:00:10.989( 10989.899 ms.)| 52.737| 00:00:00.539( 539.110 ms.)| 4.906 | 15| 05.04.2019 03:01| 4173| 3627| 00:00:00.103( 103.000 ms.)| 1.042| 00:00:00.004( 4.131 ms.)| 4.010 | 16| 05.04.2019 04:00| 4175| 3627| 00:00:00.085( 85.235 ms.)| 1.025| 00:00:00.003( 3.811 ms.)| 4.471 | 17| 05.04.2019 05:00| 4177| 3747| 00:00:00.849( 849.454 ms.)| 1.041| 00:00:00.006( 6.124 ms.)| .721 | 18| 05.04.2019 06:00| 4179| 3747| 00:00:00.849( 849.561 ms.)| 1.041| 00:00:00.000( .051 ms.)| .006 | 19| 05.04.2019 07:00| 4181| 3747| 00:00:00.839( 839.416 ms.)| 1.041| 00:00:00.000( .062 ms.)| .007 | 20| 05.04.2019 08:00| 4183| 3747| 00:00:00.846( 846.382 ms.)| 1.041| 00:00:00.000( .007 ms.)| .001 | 21| 05.04.2019 09:00| 4185| 3747| 00:00:00.855( 855.426 ms.)| 1.041| 00:00:00.000( .065 ms.)| .008 | 22| 05.04.2019 10:00| 4187| 3797| 00:01:40.150( 100150.165 ms.)| 1.055| 00:00:21.845( 21845.217 ms.)| 21.812
Textus omnium selectionum SQL
inquisitionis
SELECT
queryid ,
query
FROM
pg_stat_history
WHERE
queryid IS NOT NULL AND
database_id = DATABASE_ID AND
snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY queryid , query
exitum
Ut videre potes, instrumentis satis simplicibus utens, multas informationes utiles de onere laboris et statu basis datorum adipisci potes.
Nota:Si "queryid" in petitionibus notaveris, historiam petitionis separatae accipies (spatium conservandi causa, relationes petitionis separatae omittuntur).
Ergo, data statistica de perfunctione interrogationum praesto sunt et colliguntur.
Primum stadium "collectio datorum statisticorum" completum est.
Ad secundum gradum progredi potes - "indicatores effectuum constituere".

Sed haec omnino alia fabula est.
Ut continued ...
Source: www.habr.com
