{"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\/no\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","title":{"rendered":"Overv\u00e5king av ytelsen til PostgreSQL-foresp\u00f8rselene. Del 1 \u2014 rapportering","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ingeni\u00f8r \u2014 oversatt fra latin \u2014 inspirert.<br \/>\nIngeni\u00f8r kan gj\u00f8re alt. (c) R.Dizel.<br \/>\n<i>Epigrafene.<\/i><br \/>\n<img decoding=\"async\" alt=\"Overv\u00e5king av ytelsen til PostgreSQL-foresp\u00f8rselene. Del 1 \u2014 rapportering\" src=\"\/wp-content\/uploads\/2019\/04\/9a2640267ea05006b94e03642b864ddc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Eller historien om hvorfor databaseadministratoren b\u00f8r huske sin programmeringsfortid. <\/i><\/p>\n<h2>Forord<\/h2>\n<p>\nAlle navn er endret. Sammenfall er tilfeldig. Materialet representerer utelukkende forfatterens personlige mening.<\/p>\n<blockquote><p><b>Ansvarsfraskrivelse:<\/b> <i>det vil ikke v\u00e6re detaljert og presis beskrivelse av brukte tabeller og skript i den planlagte artikkelserien. Materialene kan ikke brukes \u00abSOM DET ER\u00bb. <br \/>\nF\u00f8rst og fremst p\u00e5 grunn av det store volumet av materiale, <br \/>\nfor det andre p\u00e5 grunn av tilpasningen til produksjonsdatabasen til den virkelige kunden. <br \/>\nDerfor vil artiklene bare inneholde ideer og beskrivelser i mest generelle termer. <br \/>\nKanskje systemet i fremtiden vil n\u00e5 niv\u00e5et for publisering p\u00e5 GitHub, eller kanskje ikke. Tiden vil vise.<\/i><\/p><\/blockquote>\n<p>\nBegynnelsen p\u00e5 historien- \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/icl_services\/blog\/446314\/\">Husker du hvordan alt begynte<\/a><\/noindex>\u00bb.<br \/>\nHva som kom ut av det, i de mest generelle trekkene- \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444988\/\">Syntese som en av metodene for \u00e5 forbedre ytelsen til PostgreSQL<\/a><\/noindex>\u00bb<\/p>\n<h2>Hvorfor trenger jeg alt dette?<\/h2>\n<p>\nVel, f\u00f8rst og fremst for \u00e5 ikke glemme det selv, n\u00e5r jeg ser tilbake p\u00e5 mine glade dager i pensjon. <br \/>\nFor det andre for \u00e5 systematisere det som er skrevet. For noen ganger begynner jeg selv \u00e5 bli forvirret og glemme enkelte deler. <\/p>\n<p>Og viktigst av alt \u2014 kanskje noen kan dra nytte av det og unng\u00e5 \u00e5 oppfinne hjulet p\u00e5 nytt og samle rake. Med andre ord, forbedre sin karma (ikke Habr-karm). For det mest verdifulle i denne verden er ideene. Det viktigste er \u00e5 finne ideen. \u00c5 realisere ideen i virkelighet er allerede et rent teknisk sp\u00f8rsm\u00e5l.<\/p>\n<p>S\u00e5, la oss begynne, gradvis...<\/p>\n<h2>Problemstillingen.<\/h2>\n<p><\/p>\n<h3>Det er: <\/h3>\n<p>\nPostgreSQL-database (10.5), blandet type last (OLTP+DSS), middels-lav belastning, plassert i AWS-skyen. <br \/>\nDatabaseoverv\u00e5king er frav\u00e6rende, overv\u00e5king av infrastrukturen presenteres i form av standardverkt\u00f8y fra AWS i minimal konfigurasjon.<\/p>\n<h3>Kreves:<\/h3>\n<p>\n\u00c5 overv\u00e5ke ytelse og tilstand p\u00e5 databasen, finne og ha utgangspunkt for optimalisering av tunge sp\u00f8rringer til databasen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Kort innledning eller analyse av l\u00f8sningsalternativer<\/h2>\n<p>\nFor \u00e5 begynne vil vi pr\u00f8ve \u00e5 unders\u00f8ke l\u00f8sningsalternativene fra et sammenlignende analyseperspektiv av fordeler og ulemper for ingeni\u00f8ren, mens nytte og tap for ledelsen f\u00e5r h\u00e5ndtere de som er p\u00e5lagt \u00e5 gj\u00f8re det if\u00f8lge stillingsbeskrivelsen.<\/p>\n<h3>Alternativ 1- \u00abWorking on demand\u00bb<\/h3>\n<p>\nVi lar alt st\u00e5 som det er. Hvis kunden ikke er forn\u00f8yd med noe i funksjonaliteten, ytelsen til databasen eller applikasjonen, vil han informere DBA-ingeni\u00f8rene via e-post eller ved \u00e5 opprette en hendelse i billettsystemet. <br \/>\nIngeni\u00f8ren, som f\u00e5r varslingen, vil unders\u00f8ke problemet, foresl\u00e5 en l\u00f8sning eller skyve problemet til side, i h\u00e5p om at det ordner seg av seg selv og at det snart vil bli glemt.<br \/>\n<b class=\"spoiler_title\">Pepperkaker og boller, bl\u00e5merker og hjernerystelser<\/b><b>Pepperkaker og boller:<\/b><br \/>\n1. Det er ikke n\u00f8dvendig \u00e5 gj\u00f8re noe overfl\u00f8dig.<br \/>\n2. Det er alltid en mulighet til \u00e5 slippe unna og ta det med ro. <br \/>\n3. Masse tid som kan brukes etter eget skj\u00f8nn.<br \/>\n<b>Bl\u00e5merker og hjernerystelser:<\/b><br \/>\n1. F\u00f8r eller senere vil kunden tenke over livets mening og universets rettferdighet i denne verden og igjen stille seg sp\u00f8rsm\u00e5let \u2013 hva betaler jeg dem pengene mine for? Konsekvensene er alltid de samme \u2013 sp\u00f8rsm\u00e5let er bare n\u00e5r kunden blir lei og vinker farvel. Og sm\u00f8ringen blir tom. Det er trist.<br \/>\n2. Ingeni\u00f8rens utvikling \u2013 null.<br \/>\n3. Vanskeligheter med planlegging av arbeid og belastning. <\/p>\n<h3>Alternativ 2 - \u00abVi danser med tamburiner, lurer dem og f\u00e5r dem til \u00e5 kj\u00f8pe\u00bb<\/h3>\n<p>\n<b>Punkt 1<\/b>- Hvorfor trenger vi et overv\u00e5kingssystem, vi vil f\u00e5 alt gjennom foresp\u00f8rslene. Vi starter en mengde foresp\u00f8rsel til datakatalogen og dynamiske fremstillinger, aktiverer forskjellige tellere, samler alt i tabeller, analyserer lister og tabeller med jevne mellomrom. Resultatet er pen eller ikke s\u00e5 pen grafikk, tabeller, rapporter. Det viktigste er at det blir mer, mer.<br \/>\n<b>Punkt 2<\/b>- Generer aktivitet \u2013 analyserer alt dette.<br \/>\n<b>Punkt 3<\/b>- Forbereder et dokument og kaller dette dokumentet ganske enkelt \u2013 \u00abhvordan vi organiserer databasen\u00bb.<br \/>\n<b>Punkt 4<\/b>- Kunden, som ser all denne prakten av grafer og tall, er i en barnslig naiv tro \u2013 n\u00e5 vil alt fungere, snart. Og han gir lett og smertefritt fra seg sine penger. Ledelsen er ogs\u00e5 sikker \u2013 ingeni\u00f8rene v\u00e5re jobber p\u00e5 spreng. Belastningen er p\u00e5 maks. <br \/>\n<b>Punkt 5<\/b>- Gjenta Punkt 1 regelmessig.<br \/>\n<b class=\"spoiler_title\">Pepperkaker og boller, bl\u00e5merker og hjernerystelser<\/b><b>Pepperkaker og boller: <\/b><br \/>\n1. Livet til ledere og ingeni\u00f8rer er enkelt, forutsigbart og fullt av aktivitet. Alt surrer, alle er opptatt. <br \/>\n2. Livet til kunden er ogs\u00e5 greit - han er alltid sikker p\u00e5 at han bare m\u00e5 vente litt til, og alt blir bra. Det blir ikke bra, vel, hva skal jeg si \u2013 verden er urettferdig, kanskje i neste liv vil det g\u00e5 bedre.<br \/>\n<b>Bl\u00e5merker og hjernerystelser:<\/b><br \/>\n1. Snart eller senere vil det dukke opp en mer effektiv leverand\u00f8r av en lignende tjeneste, som gj\u00f8r det samme, men litt billigere. Og hvis resultatet er det samme, hvorfor betale mer? Dette vil igjen f\u00f8re til at inntektene forsvinner.<br \/>\n2. Det er kjedelig. Akkurat som enhver meningsl\u00f8s aktivitet er kjedelig.<br \/>\n3. Som i det forrige alternativet \u2014 ingen utvikling. Men for ingeni\u00f8ren er ulempe at man her m\u00e5 generere en database kontinuerlig. Og det tar tid. Tid som kan brukes bedre p\u00e5 en selv, for ingen vil ta vare p\u00e5 deg, det er det ingen som bryr seg om.<\/p>\n<h3>Alternativ 3 - Du trenger ikke \u00e5 finne opp hjulet p\u00e5 nytt, kj\u00f8p det og bruk det.<\/h3>\n<p>\nIngeni\u00f8rer i andre selskaper spiser ikke pizza med \u00f8l uten grunn (ah, de gode tidene i St. Petersburg p\u00e5 90-tallet). La oss bruke overv\u00e5kingssystemer som er laget, gjort klar og fungerer, og som tross alt bringer nytte (i det minste til skaperne).<br \/>\n<b class=\"spoiler_title\">Pepperkaker og boller, bl\u00e5merker og hjernerystelser<\/b><b>Pepperkaker og boller:<\/b><br \/>\n1. Du trenger ikke \u00e5 bruke tid p\u00e5 \u00e5 finne p\u00e5 noe som allerede er oppfunnet. Ta det og bruk det.<br \/>\n2. Overv\u00e5kingssystemer er ikke laget av idioter, og de er selvf\u00f8lgelig nyttige.<br \/>\n3. Arbeidende overv\u00e5kingssystemer gir vanligvis nyttig filtrert informasjon. <br \/>\n<b>Bl\u00e5merker og hjernerystelser:<\/b><br \/>\n1. Ingeni\u00f8ren i dette tilfellet er ikke en ingeni\u00f8r, men bare en bruker av et annet produkt. Eller en bruker.<br \/>\n2. Kunden m\u00e5 overbevises om n\u00f8dvendigheten av \u00e5 kj\u00f8pe noe han egentlig ikke vil sette seg inn i, og i tillegg er budsjettet for \u00e5ret fastsatt og vil ikke endres. Deretter m\u00e5 man allokere separate ressurser, konfigurere for et bestemt system. Det vil si at man f\u00f8rst m\u00e5 betale, betale og betale igjen. Og kunden er hjemmesnekret. Det er normalen i dette livet.<\/p>\n<h2>Hva skal man gj\u00f8re - Tsjernysevskij? Ditt sp\u00f8rsm\u00e5l er veldig relevant. (c)<\/h2>\n<p>\nI dette spesifikke tilfellet og den oppst\u00e5tte situasjonen kan man gj\u00f8re det litt annerledes \u2014 <b>la oss lage v\u00e5rt eget overv\u00e5kingssystem. <\/b><br \/>\n<img decoding=\"async\" alt=\"Overv\u00e5king av ytelsen til PostgreSQL-foresp\u00f8rselene. Del 1 \u2014 rapportering\" src=\"\/wp-content\/uploads\/2019\/04\/b59a3ad9e16b68c0fbc962a61d571c52.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVel, ikke et system i ordets forstand, det ville v\u00e6re en overdrivelse og selvgodhet, men i det minste finne en m\u00e5te \u00e5 lette oppgaven p\u00e5 og samle mer informasjon for \u00e5 l\u00f8se ytelseshendelser. Slik at man ikke havner i situasjonen \u2014 \u00abg\u00e5 dit jeg ikke vet hvor, finn det jeg ikke vet hva\u00bb.<\/p>\n<h4>Hva er fordelene og ulempene med dette alternativet:<\/h4>\n<p><b>Fordeler:<\/b><br \/>\n1. Det er interessant. I hvert fall mer interessant enn konstante \u00abshrink datafile, alter tablespace, etc.\u00bb <br \/>\n2. Dette er nye ferdigheter og ny utvikling. Noe som p\u00e5 sikt vil gi velfortjente bel\u00f8nninger og fordeler.<br \/>\n<b>Ulemper:<\/b><br \/>\n1. Du m\u00e5 jobbe. Jobbe mye. <br \/>\n2. Du m\u00e5 regelmessig forklare meningen og perspektivene av all aktiviteten.<br \/>\n3. Du m\u00e5 ofre noe, for den eneste tilgjengelige ressursen for ingeni\u00f8ren \u2013 tid \u2013 er begrenset av universet. <br \/>\n<b>4. Det mest skremmende og ubehagelige<\/b> \u2013 kan resultatet bli noe som \u00abIkke mus, ikke frosk, men en ukjent skapning\u00bb.<\/p>\n<p><b>Den som ikke tar risiko, f\u00e5r ikke champagne.<\/b><br \/>\nS\u00e5 \u2014 begynner det mest interessante.<\/p>\n<h2>Den overordnede ideen \u2014 skjematisk<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Overv\u00e5king av ytelsen til PostgreSQL-foresp\u00f8rselene. Del 1 \u2014 rapportering\" src=\"\/wp-content\/uploads\/2019\/04\/d1ae2ddc1d4c43353fe93eebdaa8b81a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(<i>Illustrasjonen er hentet fra artikkelen<\/i> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444988\/\">Syntese som en av metodene for \u00e5 forbedre ytelsen til PostgreSQL<\/a><\/noindex>\u00bb)<\/p>\n<p>Forklaring:<\/p>\n<ul>\n<li> I m\u00e5lbasen installeres standardutvidelsen PostgreSQL \u2014 \u201cpg_stat_statements\u201d. <\/li>\n<li>I overv\u00e5kningsdatabasen oppretter vi et sett med tjenestetabeller for \u00e5 lagre historikk av pg_stat_statements i starten og for \u00e5 konfigurere m\u00e5linger og overv\u00e5kning videre.<\/li>\n<li> P\u00e5 overv\u00e5kningsverten lager vi et sett med bash-skript, inkludert for \u00e5 generere hendelser i billettsystemet. <\/li>\n<\/ul>\n<h2>Tjenestetabeller<\/h2>\n<p>\nFor \u00e5 begynne, her er et skjematisk forenklet ERD, hva som ble resultatet:<br \/>\n<img decoding=\"async\" alt=\"Overv\u00e5king av ytelsen til PostgreSQL-foresp\u00f8rselene. Del 1 \u2014 rapportering\" src=\"\/wp-content\/uploads\/2019\/04\/03d29f4d6932d470d9d88651cbf0c715.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b class=\"spoiler_title\">Kort beskrivelse av tabellene<\/b><b>endpoint <\/b> \u2013 vert, tilkoblingspunkt til instansen<br \/>\n<b>database <\/b> \u2013 databaseparametere<br \/>\n<b>pg_stat_history <\/b> \u2013 historisk tabell for lagring av tidsbilder av pg_stat_statements i m\u00e5lbasen<br \/>\n<b>metric_glossary <\/b> \u2013 ordbok for ytelsesm\u00e5l<br \/>\n<b>metric_config <\/b> \u2013 konfigurasjon av individuelle m\u00e5linger<br \/>\n<b>metric <\/b> \u2013 spesifik m\u00e5ling for foresp\u00f8rselen som overv\u00e5kes<br \/>\n<b>metric_alert_history <\/b> \u2013 historikk over ytelsesvarsler<br \/>\n<b>log_query <\/b> \u2013 tjenestetabell for lagring av analyserte poster fra loggfilen til PostgreSQL lastet opp fra AWS<br \/>\n<b>baseline <\/b> \u2013 parametere for tidsperioder som brukes som basis <br \/>\n<b>checkpoint <\/b> \u2013 konfigurasjon av m\u00e5linger for verifisering av databaseforhold<br \/>\n<b>checkpoint_alert_history <\/b> \u2013 historikk over varsel for m\u00e5linger av databaseforhold<br \/>\n<b>pg_stat_db_queries <\/b> \u2013 tjenestetabell for aktive foresp\u00f8rseler <br \/>\n<b>activity_log <\/b> \u2013 tjenestetabell for aktivitetslogg <br \/>\n<b>trap_oid <\/b> \u2013 tjenestetabell for konfigurasjon av fangst<\/p>\n<p><\/p>\n<h2>Trinn 1 \u2014 samle statistisk informasjon om ytelse og f\u00e5 rapporter<\/h2>\n<p>\nTabellen brukes til lagring av statistisk informasjon <b>pg_stat_history<\/b><br \/>\n<b class=\"spoiler_title\">Strukturen til tabellen pg_stat_history<\/b><\/p>\n<pre>\n                                          Tabellen \"public.pg_stat_history\"\n       Kolonne         |            Type             |                          Modifiers\n---------------------+-----------------------------+-------------------------------------------\n id                  | integer                     | not null default nextval('pg_stat_history_id_seq'::regclass)\n snapshot_timestamp  | timestamp without time zone |\n database_id         | integer                     |\n dbid                | oid                         |\n userid              | oid                         |\n queryid             | bigint                      |\n query               | text                        |\n calls               | bigint                      |\n total_time          | double precision            |\n min_time            | double precision            |\n max_time            | double precision            |\n mean_time           | double precision            |\n stddev_time         | double precision            |\n rows                | bigint                      |\n shared_blks_hit     | bigint                      |\n shared_blks_read    | bigint                      |\n shared_blks_dirtied | bigint                      |\n shared_blks_written | bigint                      |\n local_blks_hit      | bigint                      |\n local_blks_read     | bigint                      |\n local_blks_dirtied  | bigint                      |\n local_blks_written  | bigint                      |\n temp_blks_read      | bigint                      |\n temp_blks_written   | bigint                      |\n blk_read_time       | double precision            |\n blk_write_time      | double precision            |\n baseline_id         | integer                     |\nIndekser:\n    \"pg_stat_history_pkey\" PRIMARY KEY, btree (id)\n    \"database_idx\" btree (database_id)\n    \"queryid_idx\" btree (queryid)\n    \"snapshot_timestamp_idx\" btree (snapshot_timestamp)\nUtenlandske n\u00f8kkelbegrensninger:\n    \"database_id_fk\" FOREIGN KEY (database_id) REFERENCES database(id) ON DELETE CASCADE<\/pre>\n<p>\nSom vi kan se, er tabellen bare kumulative data fra visningen <b>pg_stat_statements <\/b> i databasem\u00e5l.<\/p>\n<h3>Bruken av denne tabellen er veldig enkel<\/h3>\n<p>\n<b>pg_stat_history<\/b> og vil representere oppsamlet statistikk for sp\u00f8rringer som er utf\u00f8rt hver time. I begynnelsen av hver time, etter at tabellen er fylt, blir statistikken <b>pg_stat_statements<\/b> tilbakestilt ved hjelp av <b>pg_stat_statements_reset()<\/b>.<br \/>\nMerk: <i>statistikken samles inn for foresp\u00f8rselene med en kj\u00f8retid p\u00e5 mer enn 1 sekund.<\/i><br \/>\n<b class=\"spoiler_title\">Fylling av tabellen 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 'NY SHAPSHOT BLIR OPPRETTET';\n\t\t\n\t\t--Koble til m\u00e5ldatabasen\t  \n\t    EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||endpoint_rec.host||' dbname='||database_rec.name||' user=USER password=PASSWORD '')';\n \n        RAISE NOTICE 'vert % og dbname % ',endpoint_rec.host,database_rec.name;\n\t\tRAISE NOTICE 'Lager snapshot av pg_stat_statements for databasen %',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 'Lager snapshot av pg_stat_statements for sp\u00f8rringer med min_time mer enn 1000ms';\n\t\n        FOR pg_stat_snapshot IN\n          --Alle sp\u00f8rringer med max_time st\u00f8rre enn 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>Som resultat, etter en viss tidsperiode i tabellen <b>pg_stat_history<\/b> vil vi ha et sett med bilder av innholdet i tabellen <b>pg_stat_statements <\/b>til den aktuelle databasen. <\/p>\n<h2>Rapportering<\/h2>\n<p>\nVed \u00e5 bruke enkle sp\u00f8rringer kan man f\u00e5 nyttige og interessante rapporter.<\/p>\n<h2>Aggregert data for en angitt tidsperiode<\/h2>\n<p><b class=\"spoiler_title\">Sp\u00f8rring<\/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) AS 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 Tid<\/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 Tid<\/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 etter total_tid<\/h3>\n<p><b class=\"spoiler_title\">Sp\u00f8rring<\/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 ETTER TOTAL UTF\u00d8RELSESTID\n|   #|    queryid|      calls|    calls %|                total_time (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 etter total I\/O tid<\/h4>\n<p><b class=\"spoiler_title\">Sp\u00f8rring<\/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 ET TOTAL I\/O-TID\n|   #|    queryid|      kall|    kall %|                   I\/O-tid (ms)|db I\/O-tid %\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 etter maks tidsbruk for utf\u00f8relse<\/h4>\n<p><b class=\"spoiler_title\">Sp\u00f8rring<\/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 ET MAKS UTF\u00d8RELSSTID\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 etter DELT buffer lesing\/skriving<\/h4>\n<p><b class=\"spoiler_title\">Sp\u00f8rring<\/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 BY SHARED BUFFER READ\/WRITE\n|   #|          snapshot| snapshotID|    queryid|   shared blocks read|  shared blocks write\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 for query distribution by maximum execution time<\/h4>\n<p><b class=\"spoiler_title\">Foresp\u00f8rsel<\/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| MAX_TIME HISTOGRAM\n| TOTAL CALLS : 33851920\n| MIN TIME  : 00:00:01.063\n| MAX TIME  : 00:02:01.869\n---------------------------------------------------------------------------------\n|                      min duration|                      max duration|     calls\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 snapshots by queries per second<\/h4>\n<p><b class=\"spoiler_title\">Foresp\u00f8rsel<\/b><\/p>\n<pre><code class=\"plaintext\">--pg_qps.sql\n--Beregn foresp\u00f8rsel per sekund \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 'FEIL - Fant ikke pg_stat_history for 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 Snapshots rangert av QueryPerSeconds tal\n-----------------------------------------------------------------------------------------------------------------------------------------------\n|    #|          snapshot| snapshotID|      calls|                      total dbtime|        QPS|                          I\/O time| I\/O time %\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>Timeleggjing av utf\u00f8ringshistorikk med QueryPerSeconds og I\/O tid<\/h4>\n<p><b class=\"spoiler_title\">Sp\u00f8rring<\/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| TIMEKORT FOR UTF\u00d8RING MED QueryPerSeconds OG I\/O TID\n-----------------------------------------------------------------------------------------------------------------------------------------------\n| HISTORIKK FOR SP\u00d8RSM\u00c5L PER SEKUND\n|    #|          snapshot| snapshotID|      anrop|                      total dbtime|        QPS|                          I\/O tid| I\/O tid %\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 av alle SQL-valg<\/h4>\n<p><b class=\"spoiler_title\">Sp\u00f8rring<\/b><\/p>\n<pre><code class=\"plaintext\">VELG \n  queryid , \n  query \nFR\u00c5 \n  pg_stat_history\nKOR \n  queryid ER IKKE NULL OG \n  database_id = DATABASE_ID  OG\n  snapshot_timestamp MELLOM BEGIN_TIMEPOINT OG END_TIMEPOINT\nGRUPPER ETTER queryid , query\n<\/code><\/pre>\n<h2>Resultat<\/h2>\n<p>\nSom tydelig er det mulig \u00e5 f\u00e5 en betydelig mengde nyttig informasjon om belastning og tilstand p\u00e5 databasen ved hjelp av ganske enkle midler. <\/p>\n<p><b>Merknad:<\/b>Hvis vi fikserer queryid i foresp\u00f8rslene, vil vi f\u00e5 historikk for den enkelte foresp\u00f8rselen (for \u00e5 spare plass er rapportene for den enkelte foresp\u00f8rselen utelatt).<\/p>\n<p>S\u00e5, statistiske data om foresp\u00f8rselers ytelse \u2014 er samlet og tilgjengelig.<br \/>\nF\u00f8rste fase \u00abinnsamling av statistiske data\u00bb \u2014 er fullf\u00f8rt.<\/p>\n<p>Vi kan g\u00e5 videre til den andre fasen - \u00abjustering av ytelsesmetrikker\u00bb.<br \/>\n<img decoding=\"async\" alt=\"Overv\u00e5king av ytelsen til PostgreSQL-foresp\u00f8rselene. Del 1 \u2014 rapportering\" src=\"\/wp-content\/uploads\/2019\/04\/a893e49280d4cb425e4667a5c51d2397.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Men det er en helt annen historie.<\/b><\/p>\n<p><i>Fortsettelse f\u00f8lger...<\/i><br \/>\n<br \/>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47Overv\u00e5kning av ytelsen til foresp\u00f8rslene i PostgreSQL. Del 1 \u2014 rapportering | ProHoster","description":"Ingeni\u00f8r \u2014 oversatt fra latin \u2014 inspirert. Ingeni\u00f8r kan alt. (c) R.Diesel. Epigrafer.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/32353","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=32353"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/32353\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/24168"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=32353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=32353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=32353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}