{"id":32353,"date":"2019-10-31T21:46:32","date_gmt":"2019-10-31T18:46:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting\/"},"modified":"2019-10-31T21:46:32","modified_gmt":"2019-10-31T18:46:32","slug":"monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","title":{"rendered":"Pra\u0107enje performansi upita PostgreSQL. Dio 1 \u2014 izvje\u0161tavanje","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>In\u017eenjer \u2014 na latinskom jeziku \u2014 nadahnut.<br \/>\nIn\u017eenjer mo\u017ee sve. (c) R.Dizel.<br \/>\n<i>Epigrafi.<\/i><br \/>\n<img decoding=\"async\" alt=\"Pra\u0107enje performansi upita PostgreSQL. Dio 1 \u2014 izvje\u0161tavanje\" src=\"\/wp-content\/uploads\/2019\/04\/9a2640267ea05006b94e03642b864ddc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Ili pri\u010da o tome za\u0161to bi administrator baza podataka trebao da se seti svoje programske pro\u0161losti. <\/i><\/p>\n<h2>Predgovor<\/h2>\n<p>\nSva imena su promenjena. Podudarnosti su slu\u010dajne. Materijal predstavlja isklju\u010divo li\u010dno mi\u0161ljenje autora.<\/p>\n<blockquote><p><b>Odricanje od garancija:<\/b> <i>u planiranom ciklusu \u010dlanaka ne\u0107e biti detaljnog i ta\u010dnog opisa kori\u0161\u0107enih tabela i skripti. Materijali se ne mogu odmah koristiti \"BA\u0160 TAKO\". <br \/>\nPrvo, zbog velike koli\u010dine materijala, <br \/>\ndrugo, zbog prilago\u0111enosti produkcijskoj bazi stvarnog klijenta. <br \/>\nS toga \u0107e \u010dlanci sadr\u017eati samo ideje i opise u najop\u0161tijem smislu. <br \/>\nMo\u017eda \u0107e u budu\u0107nosti sistem sazreti do nivoa postavljanja na GitHub, a mo\u017eda i ne\u0107e. Vreme \u0107e pokazati.<\/i><\/p><\/blockquote>\n<p>\nPo\u010detak pri\u010de \u2014 \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/icl_services\/blog\/446314\/\">Se\u0107a\u0161 li se kako je sve po\u010delo<\/a><\/noindex>\u00bb.<br \/>\n\u0160ta je rezultat, u najop\u0161tijim crtama \u2014 \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444988\/\">Sintez kao jedna od metoda pobolj\u0161anja performansi PostgreSQL-a<\/a><\/noindex>\u00bb<\/p>\n<h2>Za\u0161to mi je sve ovo?<\/h2>\n<p>\nPa, prvenstveno, da ne zaboravim, setiv\u0161i se u penziji lepih dana. <br \/>\nDrugo, da sistematizujem napisano. Jer se ve\u0107 i sam, ponekad, po\u010dinjem zbunjivati i zaboravljati pojedine delove. <\/p>\n<p>I najva\u017enije \u2014 mo\u017eda \u0107e nekome zatrebati i pomo\u0107i da ne izmi\u0161lja bicikl i ne sakuplja lopate. Drugim re\u010dima, pobolj\u0161ati svoju karmu (ne Habr-ovu). Jer, najvrednije u ovom svetu su ideje. Bitno je prona\u0107i ideju. A realizovati ideju u stvarnost to je ve\u0107 isklju\u010divo tehni\u010dko pitanje.<\/p>\n<p>Dakle, po\u010dnimo polako\u2026<\/p>\n<h2>Postavljanje zadatka.<\/h2>\n<p><\/p>\n<h3>Postoji: <\/h3>\n<p>\nBaza podataka PostgreSQL (10.5), me\u0161ovitog tipa optere\u0107enja (OLTP+DSS), srednje-male optere\u0107enosti, sme\u0161tena u oblaku AWS. <br \/>\nNadzor baze podataka je odsutan, nadzor infrastrukture predstavljen je u obliku standardnih sredstava AWS u minimalnoj konfiguraciji.<\/p>\n<h3>Potrebno:<\/h3>\n<p>\nNadzor performansi i stanja baze podataka, pronala\u017eenje i posedovanje osnovnih informacija za optimizaciju te\u0161kih upita ka BDP-u.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Kratko uvod ili analiza mogu\u0107nosti re\u0161enja<\/h2>\n<p>\nZa po\u010detak, poku\u0161ajmo da razlo\u017eimo mogu\u0107nosti re\u0161enja problema sa stanovi\u0161ta komparativne analize koristi i neugodnosti za in\u017eenjera, a koristi i gubici menad\u017ementa neka se bave oni kojima je to povereno prema radnom nalogu.<\/p>\n<h3>Opcija 1 \u2014 \"Rad na zahtev\"<\/h3>\n<p>\nOstavljamo sve kako jest. Ako naru\u010ditelja ne\u0161to ne zadovoljava u radu, performansama baze podataka ili aplikacije, obavijestit \u0107e DBA in\u017eenjere putem e-maila ili otvaranjem incidenta u sustavu za podr\u0161ku. <br \/>\nIn\u017eenjer koji primi obavijest \u0107e razmotriti problem, predlo\u017eiti rje\u0161enje ili odlo\u017eiti problem nadaju\u0107i se da \u0107e se sve samo rije\u0161iti, a i svejedno, uskoro \u0107e se sve zaboraviti.<br \/>\n<b class=\"spoiler_title\">Kola\u010di\u0107i i peciva, modrice i kvrge<\/b><b>Kola\u010di\u0107i i peciva:<\/b><br \/>\n1. Nema potrebe za dodatnim akcijama<br \/>\n2. Uvijek postoji prilika za izbjegavanje odgovornosti i izle\u017eavanje. <br \/>\n3. Puno vremena koje mo\u017eete provesti prema vlastitom naho\u0111enju.<br \/>\n<b>Modrice i kvrge:<\/b><br \/>\n1. Pr sooner ili kasnije, naru\u010ditelj \u0107e se zapitati o su\u0161tini postojanja i univerzalnoj pravdi u ovom svijetu i ponovno \u0107e postaviti pitanje \u2014 za\u0161to pla\u0107am svoje novce? Posljedica je uvijek ista \u2014 pitanje je samo kada \u0107e se naru\u010ditelj umoriti i mahati rukom na opro\u0161taj. A hranilica \u0107e opustjeti. To je tu\u017eno.<br \/>\n2. Razvoj in\u017eenjera \u2014 nula.<br \/>\n3. Te\u0161ko\u0107e u planiranju rada i optere\u0107enja <\/p>\n<h3>Opcija 2 - \"Igramo se s bubnjem, prodajemo i obuvamo\"<\/h3>\n<p>\n<b>To\u010dka 1<\/b>-Za\u0161to nam treba sustav nadzora, sve \u0107emo primati putem zahtjeva. Pokre\u0107emo hrpu razli\u010ditih upita prema rje\u010dniku podataka i dinami\u010dkim prikazima, uklju\u010dujemo razli\u010dite broja\u010de, sve svodimo u tablice, povremeno analiziramo popise i tablice. Kao rezultat toga imamo lijepe ili ne tako lijepe grafikone, tablice, izvje\u0161taje. Glavno je da bude \u0161to vi\u0161e, \u0161to vi\u0161e.<br \/>\n<b>To\u010dka 2<\/b>-Generiramo aktivnost - pokre\u0107emo analizu svega toga.<br \/>\n<b>To\u010dka 3<\/b>-Pripremamo neki dokument, nazivamo ga jednostavno \u2013 \u201ekako urediti bazu podataka\u201c.<br \/>\n<b>To\u010dka 4<\/b>-Naru\u010ditelj, vide\u0107i svu tu ljepotu grafikona i brojeva, ostaje u dje\u010djoj naivnoj uvjerenosti \u2013 sad \u0107e sve raditi, uskoro. I lako i bezbolno se odri\u010de svojih nov\u010danih sredstava. Menad\u017ement tako\u0111er vjeruje \u2013 na\u0161i in\u017eenjeri rade fenomenalno. Optere\u0107enje je na maksimumu. <br \/>\n<b>To\u010dka 5<\/b>-Redovito ponavljanje to\u010dke 1.<br \/>\n<b class=\"spoiler_title\">Kola\u010di\u0107i i peciva, modrice i kvrge<\/b><b>Kola\u010di\u0107i i peciva: <\/b><br \/>\n1. \u017divot menad\u017eera i in\u017eenjera \u2013 jednostavan, predvidljiv i ispunjen aktivno\u0161\u0107u. Sve zuji, svi su zaposleni. <br \/>\n2. \u017divot naru\u010ditelja tako\u0111er nije lo\u0161 \u2013 uvijek je siguran da treba malo pri\u010dekati i sve \u0107e se srediti. Ne ide, pa \u0161to \u2013 svijet je nepravedan, u sljede\u0107em \u017eivotu \u2013 bit \u0107e sre\u0107e.<br \/>\n<b>Modrice i kvrge:<\/b><br \/>\n1. Pr sooner ili kasnije, prona\u0107i \u0107e se br\u017ei pru\u017eatelj sli\u010dne usluge koji \u0107e raditi isto, ali malo jeftinije. A ako je rezultat isti, za\u0161to pla\u0107ati vi\u0161e. To \u0107e opet dovesti do nestanka hrane.<br \/>\n2. To je dosadno. Kao \u0161to je dosadna svaka malo smislenija aktivnost.<br \/>\n3. Kao i u prethodnoj verziji - nema nikakvog razvoja. No za in\u017eenjere je minus to \u0161to, za razliku od prve verzije, ovdje treba stalno generirati BDD. A to oduzima vrijeme. Koje se mo\u017ee korisno potro\u0161iti na sebe. Jer ako se sam ne brine\u0161 o sebi, svima je svejedno.<\/p>\n<h3>Opcija 3 - Ne treba osmi\u0161ljavati bicikl, treba ga kupiti i voziti.<\/h3>\n<p>\nIn\u017eenjeri drugih kompanija ne jedu pizzu bez razloga, zalivaju\u0107i je pivom (ah, slavni dani Peterburga 90-ih). Hajdemo koristiti sustave pra\u0107enja koji su napravljeni, pode\u0161eni i rade, i donose korist (barem svojim tvorcima).<br \/>\n<b class=\"spoiler_title\">Kola\u010di\u0107i i peciva, modrice i kvrge<\/b><b>Kola\u010di\u0107i i peciva:<\/b><br \/>\n1. Ne treba gubiti vrijeme na izmi\u0161ljanje onoga \u0161to je ve\u0107 izmi\u0161ljeno. Uzmi i koristi.<br \/>\n2. Sustave pra\u0107enja ne pi\u0161u budale i oni su naravno korisni.<br \/>\n3. Radni sustavi pra\u0107enja obi\u010dno daju korisne filtrirane informacije. <br \/>\n<b>Modrice i kvrge:<\/b><br \/>\n1. In\u017eenjer u ovom slu\u010daju nije in\u017eenjer, ve\u0107 samo korisnik tu\u0111eg proizvoda. Ili korisnik.<br \/>\n2. Naru\u010ditelja treba uvjeriti u potrebu kupnje ne\u010dega o \u010demu se ne razumije, i ne treba, a bud\u017eet za godinu je odobren i ne \u0107e se mijenjati. Potom treba odvojiti poseban resurs, prilagoditi ga konkretnoj sustavu. To jest, prvo treba platiti, pla\u0107ati i opet platiti. A naru\u010ditelj je \u0161krt. To je normalno u ovom \u017eivotu.<\/p>\n<h2>\u0160to u\u010diniti - \u010cerny\u0161evski? Tvoje pitanje je doista na mjestu. (c)<\/h2>\n<p>\nU ovom konkretnom slu\u010daju i postoje\u0107oj situaciji mo\u017ee se postupiti malo druga\u010dije - <b>ajmo napraviti na\u0161 vlastiti sustav pra\u0107enja. <\/b><br \/>\n<img decoding=\"async\" alt=\"Pra\u0107enje performansi upita PostgreSQL. Dio 1 \u2014 izvje\u0161tavanje\" src=\"\/wp-content\/uploads\/2019\/04\/b59a3ad9e16b68c0fbc962a61d571c52.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNo nije to sustav naravno, u punom smislu te rije\u010di, to je previ\u0161e neutemeljena tvrdnja, ali barem si olak\u0161ati zadatak i prikupiti vi\u0161e informacija za rje\u0161avanje problema s performansama. Da ne budemo u situaciji - \"idi tamo, ne znam gdje, prona\u0111i to, ne znam \u0161to\".<\/p>\n<h4>Koje su prednosti i nedostaci ove opcije:<\/h4>\n<p><b>Prednosti:<\/b><br \/>\n1. To je zanimljivo. Pa barem zanimljivije nego stalni \u201esmanji datafile, promijeni tabelarni prostor, itd.\u201d <br \/>\n2. Ovo su nove vje\u0161tine i novi razvoj. \u0160to \u0107e na du\u017ei put donijeti zaslu\u017eene nagrade i komplimente.<br \/>\n<b>Mane:<\/b><br \/>\n1. Morat \u0107ete raditi. Raditi puno. <br \/>\n2. Morat \u0107ete redovito obja\u0161njavati smisao i perspektive svih aktivnosti.<br \/>\n3. Ne\u0161to \u0107ete morati \u017ertvovati, jer je jedini dostupni resurs za in\u017eenjera \u2014 vrijeme \u2014 ograni\u010deno Univerzumom. <br \/>\n<b>4. Najgore i najneugodnije<\/b> \u2014 na kraju mo\u017ee ispasti ne\u0161to poput 'Nije mi\u0161i\u0107, nije \u017eaba, ve\u0107 nepoznata zvijer'.<\/p>\n<p><b>Tko ne riskira, ne pije \u0161ampanjac.<\/b><br \/>\nDakle \u2014 po\u010dinje najzanimljivije.<\/p>\n<h2>Op\u0107a ideja \u2014 shematski<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Pra\u0107enje performansi upita PostgreSQL. Dio 1 \u2014 izvje\u0161tavanje\" src=\"\/wp-content\/uploads\/2019\/04\/d1ae2ddc1d4c43353fe93eebdaa8b81a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(<i>Ilustracija preuzeta iz \u010dlanka<\/i> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444988\/\">Sintez kao jedna od metoda pobolj\u0161anja performansi PostgreSQL-a<\/a><\/noindex>\u00bb)<\/p>\n<p>Obja\u0161njenje:<\/p>\n<ul>\n<li> Na ciljnoj bazi se postavlja standardno pro\u0161irenje PostgreSQL \u2014 \u201cpg_stat_statements\u201d. <\/li>\n<li>U bazi podataka za pra\u0107enje stvaramo set servisnih tablica za pohranu povijesti pg_stat_statements u po\u010detnoj fazi i za postavljanje metrike i pra\u0107enje u budu\u0107nosti.<\/li>\n<li> Na hostu za pra\u0107enje stvaramo set bash skripti, uklju\u010duju\u0107i i one za generiranje incidenata u sustavu za tikete. <\/li>\n<\/ul>\n<h2>Servisne tablice<\/h2>\n<p>\nZa po\u010detak shematski pojednostavljena ERD, \u0161to smo na kraju dobili:<br \/>\n<img decoding=\"async\" alt=\"Pra\u0107enje performansi upita PostgreSQL. Dio 1 \u2014 izvje\u0161tavanje\" src=\"\/wp-content\/uploads\/2019\/04\/03d29f4d6932d470d9d88651cbf0c715.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b class=\"spoiler_title\">Kratki opis tablica<\/b><b>endpoint <\/b> \u2014 host, to\u010dka povezivanja s instancom<br \/>\n<b>database <\/b> \u2014 parametri baze podataka<br \/>\n<b>pg_stat_history <\/b> \u2014 povijesna tablica za pohranu vremenskih preslika prikaza pg_stat_statements ciljne baze podataka<br \/>\n<b>metric_glossary <\/b> \u2014 rje\u010dnik performansnih metrika<br \/>\n<b>metric_config <\/b> \u2014 konfiguracija pojedina\u010dnih metrika<br \/>\n<b>metric <\/b> \u2014 konkretna metrika za pra\u0107enje zahtjeva<br \/>\n<b>metric_alert_history <\/b> \u2014 povijest upozorenja performansi<br \/>\n<b>log_query <\/b> \u2014 servisna tablica za pohranu ra\u0161\u010dlanjenih zapisa iz log fajla PostgreSQL u\u010ditanog s AWS-a<br \/>\n<b>baseline <\/b> \u2014 parametri vremenskog razdoblja kori\u0161tenog kao osnovni <br \/>\n<b>checkpoint <\/b> \u2014 konfiguracija metrika provjere stanja baze podataka<br \/>\n<b>checkpoint_alert_history <\/b> \u2014 povijest upozorenja metrika provjere stanja baze podataka<br \/>\n<b>pg_stat_db_queries <\/b> \u2014 servisna tablica aktivnih zahtjeva <br \/>\n<b>activity_log <\/b> \u2014 servisna tablica dnevnika aktivnosti <br \/>\n<b>trap_oid <\/b> \u2014 servisna tablica konfiguracije trap<\/p>\n<p><\/p>\n<h2>Faza 1 \u2014 prikupljanje statisti\u010dkih informacija o performansama i dobivanje izvje\u0161\u0107a<\/h2>\n<p>\nZa pohranu statisti\u010dkih informacija slu\u017ei tablica <b>pg_stat_history<\/b><br \/>\n<b class=\"spoiler_title\">Struktura tablice pg_stat_history<\/b><\/p>\n<pre>\n                                          Tablica \"public.pg_stat_history\"\n       Stupac        |            Tip             |                          Modifikatori\n---------------------+-----------------------------+-------------------------------------------\n id                  | cijeli broj                 | nije null, zadana vrijednost nextval('pg_stat_history_id_seq'::regclass)\n snapshot_timestamp  | vremenska oznaka bez vremenske zone |\n database_id         | cijeli broj                 |\n dbid                | oid                         |\n userid              | oid                         |\n queryid             | veliki broj                 |\n query               | tekst                       |\n calls               | veliki broj                 |\n total_time          | dvostruka preciznost        |\n min_time            | dvostruka preciznost        |\n max_time            | dvostruka preciznost        |\n mean_time           | dvostruka preciznost        |\n stddev_time         | dvostruka preciznost        |\n rows                | veliki broj                 |\n shared_blks_hit     | veliki broj                 |\n shared_blks_read    | veliki broj                 |\n shared_blks_dirtied | veliki broj                 |\n shared_blks_written | veliki broj                 |\n local_blks_hit      | veliki broj                 |\n local_blks_read     | veliki broj                 |\n local_blks_dirtied  | veliki broj                 |\n local_blks_written  | veliki broj                 |\n temp_blks_read      | veliki broj                 |\n temp_blks_written   | veliki broj                 |\n blk_read_time       | dvostruka preciznost        |\n blk_write_time      | dvostruka preciznost        |\n baseline_id         | cijeli broj                 |\nIndeksi:\n    \"pg_stat_history_pkey\" PRIMARNI KLJU\u010c, btree (id)\n    \"database_idx\" btree (database_id)\n    \"queryid_idx\" btree (queryid)\n    \"snapshot_timestamp_idx\" btree (snapshot_timestamp)\nStrane klju\u010dne ograni\u010denja:\n    \"database_id_fk\" STRANI KLJU\u010c (database_id) REFERENCIRA database(id) PRI BRISANJU KASKADNO<\/pre>\n<p>\nKao \u0161to se mo\u017ee vidjeti, tablica predstavlja samo kumulativne podatke prikaza <b>pg_stat_statements <\/b> u ciljanom databazom.<\/p>\n<h3>Kori\u0161tenje ove tablice je vrlo jednostavno<\/h3>\n<p>\n<b>pg_stat_history<\/b> predstavljat \u0107e akumuliranu statistiku izvr\u0161enja upita za svaki sat. Na po\u010detku svakog sata, nakon popunjavanja tablice, statistika <b>pg_stat_statements<\/b> se resetira pomo\u0107u <b>pg_stat_statements_reset()<\/b>.<br \/>\nNapomena: <i>statistika se prikuplja za upite s vremenom izvr\u0161enja ve\u0107im od 1 sekunde.<\/i><br \/>\n<b class=\"spoiler_title\">Popunjavanje tablice pg_stat_history<\/b><\/p>\n<pre><code class=\"plaintext\">--pg_stat_history.sql\nCREATE OR REPLACE FUNCTION pg_stat_history( ) RETURNS boolean AS $$\nDECLARE\n  endpoint_rec record ;\n  database_rec record ;\n  pg_stat_snapshot record ;\n  current_snapshot_timestamp timestamp without time zone;\nBEGIN\n  current_snapshot_timestamp = date_trunc('minute',now());  \n  \n  FOR endpoint_rec IN SELECT * FROM endpoint \n  LOOP\n    FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id \n\t  LOOP\n\t    \n\t\tRAISE NOTICE 'NOVI SNIMAK SE KREIRA';\n\t\t\n\t\t--Spojite se s ciljanom bazom podataka\t  \n\t    EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||endpoint_rec.host||' dbname='||database_rec.name||' user=USER password=PASSWORD '')';\n \n        RAISE NOTICE 'host % i dbname % ',endpoint_rec.host,database_rec.name;\n\t\tRAISE NOTICE 'Kreiranje snimka pg_stat_statements za bazu %',database_rec.name;\n\t\t\n\t\tSELECT \n\t      *\n\t\tINTO \n\t\t  pg_stat_snapshot\n\t    FROM dblink('LINK1',\n\t      'SELECT \n\t       dbid , SUM(calls),SUM(total_time),SUM(rows) ,SUM(shared_blks_hit) ,SUM(shared_blks_read) ,SUM(shared_blks_dirtied) ,SUM(shared_blks_written) , \n           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)\n\t       FROM pg_stat_statements WHERE dbid=(SELECT oid from pg_database where datname=current_database() ) \n\t\t   GROUP BY dbid\n  \t      '\n\t               )\n\t      AS t\n\t       ( dbid oid , calls bigint , \n  \t         total_time double precision , \n\t         rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written\t bigint ,\n             local_blks_hit\t bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,\n             temp_blks_read\t bigint ,temp_blks_written bigint ,\n             blk_read_time double precision , blk_write_time double precision\t  \n\t       );\n\t\t \n\t\tINSERT INTO pg_stat_history\n          ( \n\t\t    snapshot_timestamp  ,database_id  ,\n\t\t\tdbid , calls  ,total_time ,\n            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , \t \n            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, \t\n            blk_read_time, blk_write_time \n\t\t  )\t\t  \n\t    VALUES\n\t      (\n\t       current_snapshot_timestamp ,\n\t\t   database_rec.id ,\n\t       pg_stat_snapshot.dbid ,pg_stat_snapshot.calls,\n\t       pg_stat_snapshot.total_time,\n\t       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 , \n           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , \n\t       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time \t   \n\t      );\t\t   \n\t\t  \n        RAISE NOTICE 'Kreiranje snimka pg_stat_statements za upite s min_time ve\u0107im od 1000ms';\n\t\n        FOR pg_stat_snapshot IN\n          --Svi upiti s max_time ve\u0107im od 1000 ms\n\t      SELECT \n\t        *\n\t      FROM dblink('LINK1',\n\t        'SELECT \n\t         dbid , userid ,queryid,query,calls,total_time,min_time ,max_time,mean_time, stddev_time ,rows ,shared_blks_hit ,\n\t\t\t shared_blks_read ,shared_blks_dirtied ,shared_blks_written , \n             local_blks_hit , local_blks_read , local_blks_dirtied , \n\t\t\t local_blks_written , temp_blks_read , temp_blks_written , blk_read_time , \n\t\t\t blk_write_time\n\t         FROM pg_stat_statements \n\t\t\t WHERE dbid=(SELECT oid from pg_database where datname=current_database() AND min_time &gt;= 1000 ) \n  \t        '\n\n\t                  )\n\t        AS t\n\t         ( dbid oid , userid oid , queryid bigint ,query text , calls bigint , \n  \t           total_time double precision ,min_time double precision\t ,max_time double precision\t , mean_time double precision\t ,  stddev_time double precision\t , \n\t           rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written\t bigint ,\n               local_blks_hit\t bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,\n               temp_blks_read\t bigint ,temp_blks_written bigint ,\n               blk_read_time double precision , blk_write_time double precision\t  \n\t         )\n\t    LOOP\n\t\t  INSERT INTO pg_stat_history\n          ( \n\t\t    snapshot_timestamp  ,database_id  ,\n\t\t\tdbid ,userid  , queryid  , query  , calls  ,total_time ,min_time ,max_time ,mean_time ,stddev_time ,\n            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , \t \n            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, \t\n            blk_read_time, blk_write_time \n\t\t  )\t\t  \n\t      VALUES\n\t      (\n\t       current_snapshot_timestamp ,\n\t\t   database_rec.id ,\n\t       pg_stat_snapshot.dbid ,pg_stat_snapshot.userid ,pg_stat_snapshot.queryid,pg_stat_snapshot.query,pg_stat_snapshot.calls,\n\t       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 ,\n\t       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 , \n           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , \n\t       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time \t   \n\t      );\n\t\t  \n        END LOOP;\n\n        PERFORM dblink_disconnect('LINK1');  \n\t\t\t\t\n\t  END LOOP ;--FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id \n    \n  END LOOP;\n\nRETURN TRUE;  \nEND\n$$ LANGUAGE plpgsql;<\/code><\/pre>\n<p>Kao rezultat, nakon odre\u0111enog vremenskog perioda u tablici <b>pg_stat_history<\/b> imat \u0107emo set snimaka sadr\u017eaja tablice <b>pg_stat_statements <\/b>ciljane baze podataka. <\/p>\n<h2>Sam izve\u0161taj<\/h2>\n<p>\nKoriste\u0107i jednostavne upite, mo\u017eemo dobiti prili\u010dno korisne i zanimljive izve\u0161taje.<\/p>\n<h2>Agregirani podaci za odre\u0111eni vremenski period<\/h2>\n<p><b class=\"spoiler_title\">Upit<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  database_id , \n  SUM(calls) AS calls ,SUM(total_time)  AS total_time ,\n  SUM(rows) AS rows , SUM(shared_blks_hit)  AS shared_blks_hit,\n  SUM(shared_blks_read) AS shared_blks_read ,\n  SUM(shared_blks_dirtied) AS shared_blks_dirtied,\n  SUM(shared_blks_written) AS shared_blks_written , \n  SUM(local_blks_hit) AS local_blks_hit , \n  SUM(local_blks_read) AS local_blks_read , \n  SUM(local_blks_dirtied) AS local_blks_dirtied , \n  SUM(local_blks_written)  AS local_blks_written,\n  SUM(temp_blks_read) AS temp_blks_read, \n  SUM(temp_blks_written) temp_blks_written , \n  SUM(blk_read_time) AS blk_read_time , \n  SUM(blk_write_time) AS blk_write_time\nFROM \n  pg_stat_history\nWHERE \n  queryid IS NULL AND\n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT\nGROUP BY database_id ;<\/code><\/pre>\n<p><\/p>\n<h4>DB Vrijeme<\/h4>\n<blockquote><p>to_char(interval '1 millisecond' * pg_total_stat_history_rec.total_time, 'HH24:MI:SS.MS')<\/p><\/blockquote>\n<p><\/p>\n<h4>I\/O Vrijeme<\/h4>\n<blockquote><p>to_char(interval '1 millisecond' * (pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time), 'HH24:MI:SS.MS')<\/p><\/blockquote>\n<h3>TOP10 SQL po ukupnom vremenu<\/h3>\n<p><b class=\"spoiler_title\">Upit<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  queryid , \n  SUM(calls) AS calls ,\n  SUM(total_time)  AS total_time  \t\nFROM \n  pg_stat_history\nWHERE \n  queryid IS NOT NULL AND \n  database_id = DATABASE_ID AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT \nGROUP BY queryid \nORDER BY 3 DESC \nLIMIT 10<\/code><\/pre>\n<pre>-------------------------------------------------------------------------------------\n| TOP10 SQL PO UKUPNOM VREMENU IZVR\u0160ENJA\n|   #|    queryid|      calls|    % poziva|                ukupno vreme (ms) |  % dbtime\n+----+-----------+-----------+-----------+--------------------------------+----------\n|   1|  821760255|          2|     .00001|00:03:23.141(    203141.681 ms.)|      5.42\n|   2| 4152624390|          2|     .00001|00:03:13.929(    193929.215 ms.)|      5.17\n|   3| 1484454471|          4|     .00001|00:02:09.129(    129129.057 ms.)|      3.44\n|   4|  655729273|          1|     .00000|00:02:01.869(    121869.981 ms.)|      3.25\n|   5| 2460318461|          1|     .00000|00:01:33.113(     93113.835 ms.)|      2.48\n|   6| 2194493487|          4|     .00001|00:00:17.377(     17377.868 ms.)|       .46\n|   7| 1053044345|          1|     .00000|00:00:06.156(      6156.352 ms.)|       .16\n|   8| 3644780286|          1|     .00000|00:00:01.063(      1063.830 ms.)|       .03\n<\/pre>\n<h4>TOP10 SQL po ukupnom I\/O vremenu<\/h4>\n<p><b class=\"spoiler_title\">Upit<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  queryid , \n  SUM(calls) AS calls ,\n  SUM(blk_read_time + blk_write_time)  AS io_time\nFROM \n  pg_stat_history\nWHERE \n  queryid IS NOT NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT\nGROUP BY  queryid \nORDER BY 3 DESC \nLIMIT 10<\/code><\/pre>\n<pre>----------------------------------------------------------------------------------------\n| TOP10 SQL PO UKUPNOM I\/O VREMENU\n|   #|    queryid|      pozivi|    % poziva|                   I\/O vrijeme (ms)|% vrijeme db I\/O\n+----+-----------+-----------+-----------+--------------------------------+-------------\n|   1| 4152624390|          2|     .00001|00:08:31.616(    511616.592 ms.)|        31.06\n|   2|  821760255|          2|     .00001|00:08:27.099(    507099.036 ms.)|        30.78\n|   3|  655729273|          1|     .00000|00:05:02.209(    302209.137 ms.)|        18.35\n|   4| 2460318461|          1|     .00000|00:04:05.981(    245981.117 ms.)|        14.93\n|   5| 1484454471|          4|     .00001|00:00:39.144(     39144.221 ms.)|         2.38\n|   6| 2194493487|          4|     .00001|00:00:18.182(     18182.816 ms.)|         1.10\n|   7| 1053044345|          1|     .00000|00:00:16.611(     16611.722 ms.)|         1.01\n|   8| 3644780286|          1|     .00000|00:00:00.436(       436.205 ms.)|          .03\n<\/pre>\n<h4>TOP10 SQL po maksimalnom vremenu izvr\u0161enja<\/h4>\n<p><b class=\"spoiler_title\">Upit<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  id AS snapshotid , \n  queryid , \n  snapshot_timestamp ,  \n  max_time \nFROM \n  pg_stat_history \nWHERE \n  queryid IS NOT NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT\nORDER BY 4 DESC \nLIMIT 10<\/code><\/pre>\n<p><\/p>\n<pre>-----------------------------------------------------------------------------------------\n| TOP10 SQL PO MAKSIMALNOM VREMENU IZVR\u0160ENJA\n|   #|          snapshot| snapshotID|    queryid|                           max_time (ms)\n+----+------------------+-----------+-----------+----------------------------------------\n|   1|  05.04.2019 01:03|       4169|  655729273|        00:02:01.869(    121869.981 ms.)\n|   2|  04.04.2019 17:00|       4153|  821760255|        00:01:41.570(    101570.841 ms.)\n|   3|  04.04.2019 16:00|       4146|  821760255|        00:01:41.570(    101570.841 ms.)\n|   4|  04.04.2019 16:00|       4144| 4152624390|        00:01:36.964(     96964.607 ms.)\n|   5|  04.04.2019 17:00|       4151| 4152624390|        00:01:36.964(     96964.607 ms.)\n|   6|  05.04.2019 10:00|       4188| 1484454471|        00:01:33.452(     93452.150 ms.)\n|   7|  04.04.2019 17:00|       4150| 2460318461|        00:01:33.113(     93113.835 ms.)\n|   8|  04.04.2019 15:00|       4140| 1484454471|        00:00:11.892(     11892.302 ms.)\n|   9|  04.04.2019 16:00|       4145| 1484454471|        00:00:11.892(     11892.302 ms.)\n|  10|  04.04.2019 17:00|       4152| 1484454471|        00:00:11.892(     11892.302 ms.)\n<\/pre>\n<h4>TOP10 SQL po ISKORISTI dijeljenih bafera za \u010ditanje\/zapisivanje<\/h4>\n<p><b class=\"spoiler_title\">Upit<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  id AS snapshotid , \n  queryid ,\n  snapshot_timestamp , \n  shared_blks_read , \n  shared_blks_written \nFROM \n  pg_stat_history\nWHERE \n  queryid IS NOT NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND\n  ( shared_blks_read &gt; 0 OR shared_blks_written &gt; 0 )\nORDER BY 4 DESC  , 5 DESC \nLIMIT 10<\/code><\/pre>\n<pre>--------------------------------------------------------------------------------------------\n| TOP10 SQL PREMA DELJENJU\/BROJENJU U MEMORIJI\n|   #|          snimka| snapshotID|    queryid|   dijeljeni blokovi pro\u010ditani|  dijeljeni blokovi napisani\n+----+------------------+-----------+-----------+---------------------+---------------------\n|   1|  04.04.2019 17:00|       4153|  821760255|               797308|                    0\n|   2|  04.04.2019 16:00|       4146|  821760255|               797308|                    0\n|   3|  05.04.2019 01:03|       4169|  655729273|               797158|                    0\n|   4|  04.04.2019 16:00|       4144| 4152624390|               756514|                    0\n|   5|  04.04.2019 17:00|       4151| 4152624390|               756514|                    0\n|   6|  04.04.2019 17:00|       4150| 2460318461|               734117|                    0\n|   7|  04.04.2019 17:00|       4155| 3644780286|                52973|                    0\n|   8|  05.04.2019 01:03|       4168| 1053044345|                52818|                    0\n|   9|  04.04.2019 15:00|       4141| 2194493487|                52813|                    0\n|  10|  04.04.2019 16:00|       4147| 2194493487|                52813|                    0\n--------------------------------------------------------------------------------------------\n<\/pre>\n<h4>Histogram raspodjele zahtjeva prema maksimalnom vremenu izvr\u0161avanja<\/h4>\n<p><b class=\"spoiler_title\">Upiti<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT  \n  MIN(max_time) AS hist_min  , \n  MAX(max_time) AS hist_max , \n  (( MAX(max_time) - MIN(min_time) ) \/ hist_columns ) as hist_width\nFROM \n  pg_stat_history \nWHERE \n  queryid IS NOT NULL AND\n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT ;\n\nSELECT \n  SUM(calls) AS calls\nFROM \n  pg_stat_history \nWHERE \n  queryid IS NOT NULL AND\n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND \n  ( max_time &gt;= hist_current_min AND  max_time &lt; hist_current_max ) ;\n<\/code><\/pre>\n<pre>|-----------------------------------------------------------------------------------------------\n| HISTOGRAM MAKSIMALNOG VREMENA\n| UKUPNO POZIVA : 33851920\n| MIN VRIJEME  : 00:00:01.063\n| MAX VRIJEME  : 00:02:01.869\n---------------------------------------------------------------------------------\n|                      minimalno trajanje|                      maksimalno trajanje|     pozivi\n+----------------------------------+----------------------------------+----------\n| 00:00:01.063(      1063.830 ms.) | 00:00:13.144(     13144.445 ms.) | 9\n| 00:00:13.144(     13144.445 ms.) | 00:00:25.225(     25225.060 ms.) | 0\n| 00:00:25.225(     25225.060 ms.) | 00:00:37.305(     37305.675 ms.) | 0\n| 00:00:37.305(     37305.675 ms.) | 00:00:49.386(     49386.290 ms.) | 0\n| 00:00:49.386(     49386.290 ms.) | 00:01:01.466(     61466.906 ms.) | 0\n| 00:01:01.466(     61466.906 ms.) | 00:01:13.547(     73547.521 ms.) | 0\n| 00:01:13.547(     73547.521 ms.) | 00:01:25.628(     85628.136 ms.) | 0\n| 00:01:25.628(     85628.136 ms.) | 00:01:37.708(     97708.751 ms.) | 4\n| 00:01:37.708(     97708.751 ms.) | 00:01:49.789(    109789.366 ms.) | 2\n| 00:01:49.789(    109789.366 ms.) | 00:02:01.869(    121869.981 ms.) | 0\n<\/pre>\n<h4>TOP10 Snimki prema broju upita u sekundi<\/h4>\n<p><b class=\"spoiler_title\">Upiti<\/b><\/p>\n<pre><code class=\"plaintext\">--pg_qps.sql\n--Izra\u010dunaj Upiti Po Sekundi \nCREATE OR REPLACE FUNCTION pg_qps( pg_stat_history_id integer ) RETURNS double precision AS $$\nDECLARE\n pg_stat_history_rec record ;\n prev_pg_stat_history_id integer ;\n prev_pg_stat_history_rec record;\n total_seconds double precision ;\n result double precision;\nBEGIN \n  result = 0 ;\n  \n  SELECT *\n  INTO pg_stat_history_rec\n  FROM \n    pg_stat_history\n  WHERE id = pg_stat_history_id ;\n\n  IF pg_stat_history_rec.snapshot_timestamp IS NULL \n  THEN\n    RAISE EXCEPTION 'GRE\u0160KA - Nije prona\u0111ena pg_stat_history za id = %',pg_stat_history_id;\n  END IF ;  \n  \n --RAISE NOTICE 'pg_stat_history_id = % , snapshot_timestamp = %', pg_stat_history_id , \n pg_stat_history_rec.snapshot_timestamp ;\n  \n  SELECT \n    MAX(id)   \n  INTO\n    prev_pg_stat_history_id\n  FROM\n    pg_stat_history\n  WHERE \n    database_id = pg_stat_history_rec.database_id AND\n\tqueryid IS NULL AND\n\tid  0 \n  THEN\n    result = pg_stat_history_rec.calls \/ total_seconds ;\n  ELSE\n   result = 0 ; \n  END IF;\n   \n RETURN result ;\nEND\n$$ LANGUAGE plpgsql;\n\n\nSELECT \n  id , \n  snapshot_timestamp ,\n  calls , \t\n  total_time , \n  ( select pg_qps( id )) AS QPS ,\n  blk_read_time ,\n  blk_write_time\nFROM \n  pg_stat_history\nWHERE \n  queryid IS NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND\n  ( select pg_qps( id )) IS NOT NULL \nORDER BY 5 DESC \nLIMIT 10\n<\/code><\/pre>\n<pre>|-----------------------------------------------------------------------------------------------\n| TOP10 Snimci raspore\u0111eni prema broju upita u sekundi\n-----------------------------------------------------------------------------------------------------------------------------------------------\n|    #|          snimak| snimakID|      pozivi|                      ukupno vrijeme DB|        QPS|                          I\/O vrijeme| I\/O vrijeme %\n+-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+-----------\n|    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\n|    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\n|    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\n|    4|  04.04.2019 21:03|       4163|    2781536|  00:03:06.470(    186470.979 ms.)|    785.745|  00:00:00.249(       249.865 ms.)|       .134\n|    5|  04.04.2019 19:03|       4159|    2890362|  00:03:16.784(    196784.755 ms.)|    776.979|  00:00:01.441(      1441.386 ms.)|       .732\n|    6|  04.04.2019 14:00|       4137|    2397326|  00:04:43.033(    283033.854 ms.)|    665.924|  00:00:00.024(        24.505 ms.)|       .009\n|    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\n|    8|  04.04.2019 13:00|       4135|    2373043|  00:04:26.791(    266791.988 ms.)|    659.179|  00:00:00.064(        64.261 ms.)|       .024\n|    9|  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\n|   10|  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\n<\/pre>\n<h4>Satna povijest izvr\u0161enja s upitima u sekundi i vremenom I\/O<\/h4>\n<p><b class=\"spoiler_title\">Upit<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  id , \n  snapshot_timestamp ,\n  calls , \t\n  total_time , \n  ( select pg_qps( id )) AS QPS ,\n  blk_read_time ,\n  blk_write_time\nFROM \n  pg_stat_history\nWHERE \n  queryid IS NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT\nORDER BY 2\n<\/code><\/pre>\n<pre>|-----------------------------------------------------------------------------------------------\n| POVIJEST IZVR\u0160ENJA PO SATU S QueryPerSeconds i I\/O Vremenom\n-----------------------------------------------------------------------------------------------------------------------------------------------\n| POVIJEST UPITA PO SEKUNDI\n|    #|          snimka| IDsnimke|      pozivi|                      ukupno dbvrijeme|        QPS|                          I\/O vrijeme| I\/O vrijeme %\n+-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+-----------\n|    1|  04.04.2019 11:00|       4131|       3747|  00:00:00.835(       835.374 ms.)|      1.041|  00:00:00.000(          .000 ms.)|       .000\n|    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\n|    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\n|    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\n|    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\n|    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\n|    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\n|    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\n|    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\n|   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\n|   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\n|   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\n|   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\n|   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\n|   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\n|   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\n|   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\n|   18|  05.04.2019 06:00|       4179|       3747|  00:00:00.849(       849.561 ms.)|      1.041|  00:00:00.000(          .051 ms.)|       .006\n|   19|  05.04.2019 07:00|       4181|       3747|  00:00:00.839(       839.416 ms.)|      1.041|  00:00:00.000(          .062 ms.)|       .007\n|   20|  05.04.2019 08:00|       4183|       3747|  00:00:00.846(       846.382 ms.)|      1.041|  00:00:00.000(          .007 ms.)|       .001\n|   21|  05.04.2019 09:00|       4185|       3747|  00:00:00.855(       855.426 ms.)|      1.041|  00:00:00.000(          .065 ms.)|       .008\n|   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\n<\/pre>\n<h4>Tekst svih SQL-upita<\/h4>\n<p><b class=\"spoiler_title\">Upit<\/b><\/p>\n<pre><code class=\"plaintext\">ODABERITE \n  queryid , \n  query \nIZ \n  pg_stat_history\nGDJE \n  queryid NIJE NULL I \n  database_id = DATABASE_ID  I\n  snapshot_timestamp IZME\u0110U BEGIN_TIMEPOINT I END_TIMEPOINT\nGRUPI\u0160I queryid , query\n<\/code><\/pre>\n<h2>Zaklju\u010dak<\/h2>\n<p>\nKao \u0161to se mo\u017ee vidjeti, prili\u010dno jednostavnim sredstvima, mo\u017ee se dobiti dosta korisnih informacija o optere\u0107enju i stanju baze. <\/p>\n<p><b>Napomena:<\/b>Ako u upitima fiksiramo queryid, dobijamo povijest za pojedina\u010dni upit (s ciljem u\u0161tede prostora, izvje\u0161taji po pojedina\u010dnom upitu su izostavljeni).<\/p>\n<p>Dakle, statisti\u010dki podaci o performansama upita \u2014 postoje i prikupljaju se.<br \/>\nPrva faza \u201eprikupljanje statisti\u010dkih podataka\u201c \u2014 zavr\u0161ena.<\/p>\n<p>Mo\u017ee se pre\u0107i na drugu fazu - \u201epostavljanje metrika performansi\u201c.<br \/>\n<img decoding=\"async\" alt=\"Pra\u0107enje performansi upita PostgreSQL. Dio 1 \u2014 izvje\u0161tavanje\" src=\"\/wp-content\/uploads\/2019\/04\/a893e49280d4cb425e4667a5c51d2397.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>No, to je ve\u0107 sasvim druga pri\u010da.<\/b><\/p>\n<p><i>Nastavak slijedi\u2026<\/i><br \/>\n<br \/>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/icl_services\/blog\/446734\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u2014 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0441 \u043b\u0430\u0442\u044b\u043d\u0438 \u2014 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439. \u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0451. (\u0441) \u0420.\u0414\u0438\u0437\u0435\u043b\u044c. \u042d\u043f\u0438\u0433\u0440\u0430\u0444\u044b. \u0418\u043b\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u0437\u0430\u0447\u0435\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0435. \u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 \u0412\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u0421\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438\u0447\u043d\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430. Disclaimer of warranties: \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24168,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32353","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u2014 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0441 \u043b\u0430\u0442\u044b\u043d\u0438 \u2014 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439. \u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0451. (\u0441) \u0420.\u0414\u0438\u0437\u0435\u043b\u044c. \u042d\u043f\u0438\u0433\u0440\u0430\u0444\u044b.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 PostgreSQL. \u0427\u0430\u0441\u0442\u044c 1 \u2014 \u0440\u0435\u043f\u043e\u0440\u0442\u0438\u043d\u0433 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u2014 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0441 \u043b\u0430\u0442\u044b\u043d\u0438 \u2014 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439. \u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0451. (\u0441) \u0420.\u0414\u0438\u0437\u0435\u043b\u044c. \u042d\u043f\u0438\u0433\u0440\u0430\u0444\u044b.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:46:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:46:32+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Pra\u0107enje performansi upita PostgreSQL. Dio 1 \u2014 izvje\u0161tavanje | ProHoster","description":"In\u017eenjer \u2014 u latinskom prevodu \u2014 inspiriran. In\u017eenjer mo\u017ee sve. (c) R.Dizel. Epigrafi.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 PostgreSQL. \u0427\u0430\u0441\u0442\u044c 1 \u2014 \u0440\u0435\u043f\u043e\u0440\u0442\u0438\u043d\u0433 | ProHoster","og:description":"\u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u2014 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0441 \u043b\u0430\u0442\u044b\u043d\u0438 \u2014 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439. \u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0451. (\u0441) \u0420.\u0414\u0438\u0437\u0435\u043b\u044c. \u042d\u043f\u0438\u0433\u0440\u0430\u0444\u044b.","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:46:32+00:00","article:modified_time":"2019-10-31T18:46:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32353","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 10:28:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:13:42","updated":"2026-01-21 10:28:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/32353","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=32353"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/32353\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/24168"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=32353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=32353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=32353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}