{"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\/sv\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","title":{"rendered":"\u00d6vervakning av prestandan f\u00f6r PostgreSQL-fr\u00e5gor. Del 1 - rapportering","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ingenj\u00f6r \u2013 \u00f6versatt fr\u00e5n latin betyder inspirerad.<br \/>\nIngenj\u00f6r kan g\u00f6ra allt. (c) R.Diesel.<br \/>\n<i>Epigraf.<\/i><br \/>\n<img decoding=\"async\" alt=\"\u00d6vervakning av prestandan f\u00f6r PostgreSQL-fr\u00e5gor. Del 1 - rapportering\" src=\"\/wp-content\/uploads\/2019\/04\/9a2640267ea05006b94e03642b864ddc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Eller historien om varf\u00f6r en databasadministrat\u00f6r b\u00f6r minnas sin programmeringsbakgrund. <\/i><\/p>\n<h2>F\u00f6rord<\/h2>\n<p>\nAlla namn har \u00e4ndrats. Eventuella likheter \u00e4r slumpm\u00e4ssiga. Materialet representerar enbart f\u00f6rfattarens personliga \u00e5sikt.<\/p>\n<blockquote><p><b>Ansvarsfriskrivning:<\/b> <i>i det planerade artikelcykeln kommer det inte att finnas n\u00e5gon detaljerad eller exakt beskrivning av de anv\u00e4nda tabellerna och skripten. Materialet kan inte anv\u00e4ndas direkt \u201dAS IS\u201d. <br \/>\nF\u00f6r det f\u00f6rsta p\u00e5 grund av den stora m\u00e4ngden material, <br \/>\nf\u00f6r det andra p\u00e5 grund av anpassningen till produktionsdatabasen f\u00f6r den verkliga klienten. <br \/>\nD\u00e4rf\u00f6r kommer artiklarna att ge endast id\u00e9er och beskrivningar i mycket allm\u00e4nna termer. <br \/>\nKanske kommer systemet i framtiden att v\u00e4xa till en niv\u00e5 d\u00e4r det publiceras p\u00e5 GitHub, och kanske inte. Tiden f\u00e5r utvisa.<\/i><\/p><\/blockquote>\n<p>\nB\u00f6rjan av historien- \u201c<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/icl_services\/blog\/446314\/\">Kommer du ih\u00e5g hur allt b\u00f6rjade<\/a><\/noindex>\u00bb.<br \/>\nVad som kom ut i resultatet, i de mest allm\u00e4nna termer- \u201c<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444988\/\">Syntes som en av metoderna f\u00f6r att f\u00f6rb\u00e4ttra prestandan hos PostgreSQL<\/a><\/noindex>\u00bb<\/p>\n<h2>Varf\u00f6r jag g\u00f6r allt detta?<\/h2>\n<p>\nF\u00f6r det f\u00f6rsta f\u00f6r att jag sj\u00e4lv inte ska gl\u00f6mma, n\u00e4r jag sitter p\u00e5 pension och minns de goda gamla dagarna. <br \/>\nF\u00f6r det andra f\u00f6r att systematisera det skrivna. F\u00f6r ibland b\u00f6rjar jag sj\u00e4lv bli f\u00f6rvirrad och gl\u00f6mmer vissa delar. <\/p>\n<p>Och kanske viktigast av allt \u2013 om det kan vara till nytta f\u00f6r n\u00e5gon och hj\u00e4lpa till att inte \u00e5teruppfinna hjulet och inte snubbla \u00f6ver samma problem. Med andra ord, f\u00f6rb\u00e4ttra sin karma (inte Habr-karman). F\u00f6r det mest v\u00e4rdefulla i denna v\u00e4rld \u00e4r id\u00e9er. Huvudsaken \u00e4r att hitta en id\u00e9. Att f\u00f6rverkliga en id\u00e9 i verkligheten \u00e4r redan en rent teknisk fr\u00e5ga.<\/p>\n<p>S\u00e5, l\u00e5t oss b\u00f6rja, sakta...<\/p>\n<h2>Problemst\u00e4llning.<\/h2>\n<p><\/p>\n<h3>Finns: <\/h3>\n<p>\nPostgreSQL-databas (10.5), blandad belastningstyp (OLTP+DSS), medel-l\u00e5g belastning, placerad i molnet AWS. <br \/>\n\u00d6vervakning av databasen saknas, infrastruktur\u00f6vervakningen presenteras genom AWS: s standardverktyg i minimal konfiguration.<\/p>\n<h3>Kr\u00e4vs:<\/h3>\n<p>\n\u00d6vervaka prestanda och tillst\u00e5nd f\u00f6r databasen, samt hitta och ha initial information f\u00f6r att optimera tunga fr\u00e5gor till databasen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Kort f\u00f6rord eller analys av l\u00f6sningsalternativ<\/h2>\n<p>\nTill att b\u00f6rja med ska vi f\u00f6rs\u00f6ka analysera alternativen f\u00f6r att l\u00f6sa problemet ur ett j\u00e4mf\u00f6rande perspektiv av f\u00f6rdelar och nackdelar f\u00f6r ingenj\u00f6ren, medan f\u00f6rdelarna och f\u00f6rlusterna f\u00f6r managementet kan hanteras av de som har ansvar f\u00f6r det.<\/p>\n<h3>Alternativ 1- \u201cArbeta vid behov\u201d<\/h3>\n<p>\nVi l\u00e4mnar allt som det \u00e4r. Om kunden inte \u00e4r n\u00f6jd med n\u00e5got i databasens eller applikationens funktionalitet eller prestanda kommer han att meddela DBA-teknikerna via e-post eller skapa en incident i ticketsystemet. <br \/>\nIngenj\u00f6ren, som f\u00e5r meddelandet, kommer att unders\u00f6ka problemet, f\u00f6resl\u00e5 en l\u00f6sning eller skjuta upp problemet, i hopp om att det ordnar sig sj\u00e4lv, och \u00e4nd\u00e5 kommer snart allt att gl\u00f6mmas.<br \/>\n<b class=\"spoiler_title\">Pepparkakor och bullar, bl\u00e5m\u00e4rken och kn\u00f6lar<\/b><b>Pepparkakor och bullar:<\/b><br \/>\n1. Det beh\u00f6vs inte g\u00f6ra n\u00e5got \u00f6verfl\u00f6digt.<br \/>\n2. Det finns alltid m\u00f6jlighet att smita undan. <br \/>\n3. Massor av tid som kan anv\u00e4ndas efter eget godtycke.<br \/>\n<b>Bl\u00e5m\u00e4rken och kn\u00f6lar:<\/b><br \/>\n1. F\u00f6rr eller senare kommer kunden att b\u00f6rja t\u00e4nka p\u00e5 livets mening och universums r\u00e4ttvisa i denna v\u00e4rld och \u00e5terigen st\u00e4lla sig fr\u00e5gan \u2013 varf\u00f6r betalar jag dem mina pengar? Konsekvensen \u00e4r alltid densamma \u2013 fr\u00e5gan \u00e4r bara n\u00e4r kunden kommer att tr\u00f6ttna och vinka adj\u00f6. Och foderstationen kommer att bli tom. Det \u00e4r sorgligt.<br \/>\n2. Ingenj\u00f6rens utveckling \u2013 noll.<br \/>\n3. Sv\u00e5righeter med planering av arbete och belastning <\/p>\n<h3>Alternativ 2 \u2013 \"Vi dansar med trumman, s\u00e4ljer och s\u00e4tter p\u00e5 dem\"<\/h3>\n<p>\n<b>Punkt 1<\/b>- Varf\u00f6r beh\u00f6ver vi ett \u00f6vervakningssystem? Vi kommer att f\u00e5 allt via f\u00f6rfr\u00e5gningar. Vi k\u00f6r en massa olika f\u00f6rfr\u00e5gningar mot datakatalogen och dynamiska vyer, aktiverar olika r\u00e4knare, sammanst\u00e4ller allt i tabeller, analyserar listor och tabeller periodiskt. Resultatet \u00e4r att vi f\u00e5r snygga eller mindre snygga grafer, tabeller, rapporter. Huvudsaken \u00e4r att det \u00e4r s\u00e5 mycket som m\u00f6jligt.<br \/>\n<b>Punkt 2<\/b>- Vi genererar aktivitet \u2013 k\u00f6r en analys av allt detta.<br \/>\n<b>Punkt 3<\/b>- Vi f\u00f6rbereder ett dokument som vi helt enkelt kallar \u2013 \"hur vi ska organisera databasen\".<br \/>\n<b>Punkt 4<\/b>- Kunden, som ser all denna prakt av grafer och siffror, befinner sig i en barnslig och naiv \u00f6vertygelse \u2013 nu fungerar allt snart. Och han skiljer sig l\u00e4tt och smidigt fr\u00e5n sina ekonomiska resurser. Ledningen \u00e4r ocks\u00e5 \u00f6vertygad \u2013 ingenj\u00f6rerna arbetar verkligen h\u00e5rt. Belastningen \u00e4r p\u00e5 max. <br \/>\n<b>Punkt 5<\/b>- Upprepa regelbundet Punkt 1.<br \/>\n<b class=\"spoiler_title\">Pepparkakor och bullar, bl\u00e5m\u00e4rken och kn\u00f6lar<\/b><b>Pepparkakor och bullar: <\/b><br \/>\n1. Livet f\u00f6r chefer och ingenj\u00f6rer \u00e4r enkelt, f\u00f6ruts\u00e4gbart och fullt av aktivitet. Allt surrar, alla \u00e4r upptagna. <br \/>\n2. Livet f\u00f6r kunden \u00e4r ocks\u00e5 bra \u2013 han \u00e4r alltid s\u00e4ker p\u00e5 att han bara beh\u00f6ver v\u00e4nta lite till s\u00e5 kommer allt att bli bra. Det blir det inte, men vad ska man g\u00f6ra \u2013 v\u00e4rlden \u00e4r or\u00e4ttvis, i n\u00e4sta liv kanske det blir tur.<br \/>\n<b>Bl\u00e5m\u00e4rken och kn\u00f6lar:<\/b><br \/>\n1. Fr\u00e5gan \u00e4r inte om, utan n\u00e4r, en mer effektiv leverant\u00f6r av samma tj\u00e4nst dyker upp, som erbjuder detsamma, men n\u00e5got billigare. Om resultatet \u00e4nd\u00e5 \u00e4r detsamma, varf\u00f6r betala mer? Det leder \u00e5terigen till att f\u00f6rs\u00f6rjningen f\u00f6rsvinner.<br \/>\n2. Det \u00e4r tr\u00e5kigt. Precis som vilken meningsl\u00f6s aktivitet som helst.<br \/>\n3. Precis som i det f\u00f6reg\u00e5ende alternativet \u2013 det sker ingen utveckling. Men f\u00f6r ingenj\u00f6ren \u00e4r nackdelen att, till skillnad fr\u00e5n det f\u00f6rsta alternativet, h\u00e4r m\u00e5ste man st\u00e4ndigt generera databaser. Och det tar tid. Tid som kan anv\u00e4ndas mer f\u00f6rdelaktigt f\u00f6r sig sj\u00e4lv. F\u00f6r om man inte tar hand om sig sj\u00e4lv, bryr sig ingen om en.<\/p>\n<h3>Alternativ 3 \u2013 Man beh\u00f6ver inte hitta p\u00e5 hjulet igen, man beh\u00f6ver k\u00f6pa det och \u00e5ka.<\/h3>\n<p>\nIngenj\u00f6rer fr\u00e5n andra f\u00f6retag \u00e4ter inte pizzeria utan anledning, vilket de g\u00f6r med \u00f6l (\u00e5h, de h\u00e4rliga tiderna i Sankt Petersburg p\u00e5 90-talet). L\u00e5t oss anv\u00e4nda \u00f6vervakningssystem som \u00e4r framtagna, testade och fungerar, och som faktiskt ger nytta (i alla fall f\u00f6r deras skapare).<br \/>\n<b class=\"spoiler_title\">Pepparkakor och bullar, bl\u00e5m\u00e4rken och kn\u00f6lar<\/b><b>Pepparkakor och bullar:<\/b><br \/>\n1. Man beh\u00f6ver inte sl\u00f6sa tid p\u00e5 att hitta p\u00e5 n\u00e5got som redan \u00e4r uppfunnit. Ta det som finns och anv\u00e4nd det.<br \/>\n2. \u00d6vervakningssystem skrivs inte av dumma m\u00e4nniskor och de \u00e4r sj\u00e4lvklart anv\u00e4ndbara.<br \/>\n3. Funktionerande \u00f6vervakningssystem ger vanligtvis anv\u00e4ndbar filtrerad information. <br \/>\n<b>Bl\u00e5m\u00e4rken och kn\u00f6lar:<\/b><br \/>\n1. Ingenj\u00f6ren i detta fall \u00e4r inte ingenj\u00f6r, utan bara en anv\u00e4ndare av en annans produkt. Eller en anv\u00e4ndare.<br \/>\n2. Kunden m\u00e5ste \u00f6vertygas om n\u00f6dv\u00e4ndigheten av att k\u00f6pa n\u00e5got som denne i allm\u00e4nhet inte vill, och f\u00f6r vilket denne egentligen inte beh\u00f6ver f\u00f6rst\u00e5s, och budgeten f\u00f6r \u00e5ret \u00e4r bekr\u00e4ftad och kommer inte att \u00e4ndras. Sedan m\u00e5ste man avs\u00e4tta en s\u00e4rskild resurs, st\u00e4lla in f\u00f6r det specifika systemet. Det vill s\u00e4ga, f\u00f6rst m\u00e5ste man betala, betala och betala igen. Och kunden \u00e4r sn\u00e5l. Det \u00e4r normen i detta liv.<\/p>\n<h2>Vad ska vi g\u00f6ra \u2013 Tjernysjevski? Din fr\u00e5ga \u00e4r mycket relevant. (c)<\/h2>\n<p>\nI detta specifika fall och den r\u00e5dande situationen kan man agera lite annorlunda \u2013 <b>l\u00e5t oss skapa v\u00e5rt eget \u00f6vervakningssystem. <\/b><br \/>\n<img decoding=\"async\" alt=\"\u00d6vervakning av prestandan f\u00f6r PostgreSQL-fr\u00e5gor. Del 1 - rapportering\" src=\"\/wp-content\/uploads\/2019\/04\/b59a3ad9e16b68c0fbc962a61d571c52.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00e5v\u00e4l, inte ett system i ordets fulla mening, det \u00e4r f\u00f6r kraftfullt sagt och sj\u00e4lvs\u00e4kert, men \u00e5tminstone underl\u00e4tta uppgiften och samla s\u00e5 mycket information som m\u00f6jligt f\u00f6r att l\u00f6sa prestandaincidenter. F\u00f6r att inte hamna i situationen \u2013 \"g\u00e5 dit, jag vet inte vart, hitta det, jag vet inte vad\".<\/p>\n<h4>Vilka f\u00f6rdelar och nackdelar har detta alternativ:<\/h4>\n<p><b>F\u00f6rdelar:<\/b><br \/>\n1. Det \u00e4r intressant. \u00c5tminstone intressantare \u00e4n st\u00e4ndiga \"shrink datafile, alter tablespace, etc.\" <br \/>\n2. Det h\u00e4r \u00e4r nya f\u00e4rdigheter och ny utveckling. Vilket p\u00e5 sikt, f\u00f6rr eller senare, ger v\u00e4lf\u00f6rtj\u00e4nta bel\u00f6ningar.<br \/>\n<b>Nackdelar:<\/b><br \/>\n1. Det kommer att kr\u00e4vas arbete. Mycket arbete. <br \/>\n2. Det kommer att vara n\u00f6dv\u00e4ndigt att regelbundet f\u00f6rklara syftet och perspektiven f\u00f6r alla aktiviteter.<br \/>\n3. Man m\u00e5ste offra n\u00e5got, eftersom den enda resursen som ingenj\u00f6ren har \u2014 tid \u2014 \u00e4r begr\u00e4nsad av universum. <br \/>\n<b>4. Det mest skr\u00e4mmande och obehagliga<\/b> \u2014 resultatet kan bli n\u00e5got som \"Ingen mus, ingen groda, utan ett ok\u00e4nt djur\".<\/p>\n<p><b>Den som inte riskerar f\u00e5r inte heller bubbel.<\/b><br \/>\nS\u00e5 b\u00f6rjar det mest intressanta.<\/p>\n<h2>Den \u00f6vergripande id\u00e9n \u2014 schematiskt<\/h2>\n<p>\n<img decoding=\"async\" alt=\"\u00d6vervakning av prestandan f\u00f6r PostgreSQL-fr\u00e5gor. Del 1 - rapportering\" src=\"\/wp-content\/uploads\/2019\/04\/d1ae2ddc1d4c43353fe93eebdaa8b81a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(<i>Illustrationen \u00e4r h\u00e4mtad fr\u00e5n artikeln<\/i> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444988\/\">Syntes som en av metoderna f\u00f6r att f\u00f6rb\u00e4ttra prestandan hos PostgreSQL<\/a><\/noindex>\u00bb)<\/p>\n<p>F\u00f6rklaring:<\/p>\n<ul>\n<li> I den m\u00e5lbasen installeras till\u00e4gget PostgreSQL \u2014 \u201cpg_stat_statements\u201d. <\/li>\n<li>I \u00f6vervakningsdatabasen skapar vi en upps\u00e4ttning tj\u00e4nstetabletter f\u00f6r att lagra historik f\u00f6r pg_stat_statements i det inledande skedet och f\u00f6r att konfigurera m\u00e4tv\u00e4rden och \u00f6vervakning fram\u00f6ver.<\/li>\n<li> P\u00e5 \u00f6vervakningsv\u00e4rden skapar vi en upps\u00e4ttning bash-skript, inklusive f\u00f6r att generera incidenter i biljettsystemet. <\/li>\n<\/ul>\n<h2>Tj\u00e4nstetabletter<\/h2>\n<p>\nF\u00f6rst en schematisk och f\u00f6renklad ERD, vad blev resultatet:<br \/>\n<img decoding=\"async\" alt=\"\u00d6vervakning av prestandan f\u00f6r PostgreSQL-fr\u00e5gor. Del 1 - rapportering\" src=\"\/wp-content\/uploads\/2019\/04\/03d29f4d6932d470d9d88651cbf0c715.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b class=\"spoiler_title\">Kort beskrivning av tabellerna<\/b><b>endpoint <\/b> \u2014 v\u00e4rd, punkt f\u00f6r anslutning till instansen<br \/>\n<b>database <\/b> \u2014 parametrar f\u00f6r databasen<br \/>\n<b>pg_stat_history <\/b> \u2014 historisk tabell f\u00f6r att lagra tidsbilder av presentationen av pg_stat_statements f\u00f6r m\u00e5lbasen<br \/>\n<b>metric_glossary <\/b> \u2014 ordlista f\u00f6r prestandam\u00e4tningar<br \/>\n<b>metric_config <\/b> \u2014 konfiguration av specifika m\u00e4tningar<br \/>\n<b>metric <\/b> \u2014 specifik m\u00e4tning f\u00f6r den \u00f6vervakade f\u00f6rfr\u00e5gan<br \/>\n<b>metric_alert_history <\/b> \u2014 historik \u00f6ver prestandameddelanden<br \/>\n<b>log_query <\/b> \u2014 tj\u00e4nstetabell f\u00f6r lagring av analyserade poster fr\u00e5n loggfilen i PostgreSQL som laddas fr\u00e5n AWS<br \/>\n<b>baseline <\/b> \u2014 parametrar f\u00f6r tidsperioden som anv\u00e4nds som baslinje <br \/>\n<b>checkpoint <\/b> \u2014 konfiguration av m\u00e4tningar f\u00f6r h\u00e4lsokontroll av databasen<br \/>\n<b>checkpoint_alert_history <\/b> \u2014 historik \u00f6ver meddelanden fr\u00e5n m\u00e4tningar f\u00f6r h\u00e4lsokontroll av databasen<br \/>\n<b>pg_stat_db_queries <\/b> \u2014 tj\u00e4nstetabell f\u00f6r aktiva f\u00f6rfr\u00e5gningar <br \/>\n<b>activity_log <\/b> \u2014 tj\u00e4nstetabell f\u00f6r aktivitetslogg <br \/>\n<b>trap_oid <\/b> \u2014 tj\u00e4nstetabell f\u00f6r konfiguration av trap<\/p>\n<p><\/p>\n<h2>Steg 1 \u2014 vi samlar in statistisk information om prestanda och f\u00e5r rapporter<\/h2>\n<p>\nF\u00f6r lagring av statistisk information fungerar tabellen <b>pg_stat_history<\/b><br \/>\n<b class=\"spoiler_title\">Strukturen f\u00f6r tabellen pg_stat_history<\/b><\/p>\n<pre>\n                                          Tabell \"public.pg_stat_history\"\n       Kolumn        |            Typ             |                          Modifierar\n---------------------+-----------------------------+-------------------------------------------\n id                  | heltal                     | inte null standard nextval('pg_stat_history_id_seq'::regclass)\n snapshot_timestamp  | tidsst\u00e4mpel utan tidszon |\n database_id         | heltal                     |\n dbid                | oid                         |\n userid              | oid                         |\n queryid             | stort heltal               |\n query               | text                        |\n calls               | stort heltal               |\n total_time          | dubbel precision            |\n min_time            | dubbel precision            |\n max_time            | dubbel precision            |\n mean_time           | dubbel precision            |\n stddev_time         | dubbel precision            |\n rows                | stort heltal               |\n shared_blks_hit     | stort heltal               |\n shared_blks_read    | stort heltal               |\n shared_blks_dirtied | stort heltal               |\n shared_blks_written | stort heltal               |\n local_blks_hit      | stort heltal               |\n local_blks_read     | stort heltal               |\n local_blks_dirtied  | stort heltal               |\n local_blks_written  | stort heltal               |\n temp_blks_read      | stort heltal               |\n temp_blks_written   | stort heltal               |\n blk_read_time       | dubbel precision            |\n blk_write_time      | dubbel precision            |\n baseline_id         | heltal                     |\nIndex:\n    \"pg_stat_history_pkey\" PRIM\u00c4R NYCKEL, btree (id)\n    \"database_idx\" btree (database_id)\n    \"queryid_idx\" btree (queryid)\n    \"snapshot_timestamp_idx\" btree (snapshot_timestamp)\nUtl\u00e4ndska nyckelbegr\u00e4nsningar:\n    \"database_id_fk\" UTL\u00c4NDSK NYCKEL (database_id) REFERENSERAR database(id) VID BORTTAGNING CASCADE<\/pre>\n<p>\nSom det framg\u00e5r representerar tabellen bara kumulativa data av vyerna <b>pg_stat_statements <\/b> i den m\u00e5l-databasen.<\/p>\n<h3>Anv\u00e4ndningen av denna tabell \u00e4r mycket enkel<\/h3>\n<p>\n<b>pg_stat_history<\/b> kommer att representera ackumulerad statistik \u00f6ver fr\u00e5gaexekvering varje timme. I b\u00f6rjan av varje timme, efter att tabellen har fyllts, \u00e5terst\u00e4lls statistiken <b>pg_stat_statements<\/b> med hj\u00e4lp av <b>pg_stat_statements_reset()<\/b>.<br \/>\nAnm\u00e4rkning: <i>statistiken samlas in f\u00f6r fr\u00e5gor med en exekveringstid \u00f6ver 1 sekund.<\/i><br \/>\n<b class=\"spoiler_title\">Fyllning 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 AVBILD SKAPAS';\n\t\t\n\t\t--Anslut till 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 'v\u00e4rd % och databas % ',endpoint_rec.host,database_rec.name;\n\t\tRAISE NOTICE 'Skapar avbild av pg_stat_statements f\u00f6r databas %',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 'Skapar avbild av pg_stat_statements f\u00f6r fr\u00e5gor med min_time \u00f6ver 1000ms';\n\t\n        FOR pg_stat_snapshot IN\n          --Alla fr\u00e5gor med max_time st\u00f6rre \u00e4n 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 ett resultat, efter en viss tidsperiod i tabellen <b>pg_stat_history<\/b> har vi en upps\u00e4ttning bilder av inneh\u00e5llet i tabellen <b>pg_stat_statements <\/b>f\u00f6r den aktuella databasen. <\/p>\n<h2>Sj\u00e4lva rapporteringen<\/h2>\n<p>\nMed hj\u00e4lp av enkla fr\u00e5gor kan man f\u00e5 ganska anv\u00e4ndbara och intressanta rapporter.<\/p>\n<h2>Aggerade data f\u00f6r den angivna tidsperioden<\/h2>\n<p><b class=\"spoiler_title\">Fr\u00e5ga<\/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 Tid<\/h4>\n<blockquote><p>to_char(interval &#8216;1 millisecond&#8217; * pg_total_stat_history_rec.total_time, &#8216;HH24:MI:SS.MS&#8217;)<\/p><\/blockquote>\n<p><\/p>\n<h4>I\/O Tid<\/h4>\n<blockquote><p>to_char(interval &#8216;1 millisecond&#8217; * ( pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time ), &#8216;HH24:MI:SS.MS&#8217;)<\/p><\/blockquote>\n<h3>TOP10 SQL efter total tid<\/h3>\n<p><b class=\"spoiler_title\">Fr\u00e5ga<\/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 EFTER TOTAL UTF\u00d6RANDE TID\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 efter total I\/O tid<\/h4>\n<p><b class=\"spoiler_title\">Fr\u00e5ga<\/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 EFTER TOTAL TID I\/O\n|   #|    queryid|      anrop|    anrop %|                   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 efter max exekveringstid<\/h4>\n<p><b class=\"spoiler_title\">Fr\u00e5ga<\/b><\/p>\n<pre><code class=\"plaintext\">V\u00c4LJ \n  id SOM snapshotid , \n  queryid , \n  snapshot_timestamp ,  \n  max_time \nFR\u00c5N \n  pg_stat_history \nD\u00c4R \n  queryid \u00c4R INTE NULL OCH \n  database_id = DATABASE_ID  OCH\n  snapshot_timestamp MELLAN BEGIN_TIMEPOINT OCH END_TIMEPOINT\nORDNA EFTER 4 DESC \nBEGR\u00c4NSA 10<\/code><\/pre>\n<p><\/p>\n<pre>-----------------------------------------------------------------------------------------\n| TOP10 SQL EFTER MAX EXEKVERINGSTID\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 efter DELAD buffer l\u00e4sning\/skrivning<\/h4>\n<p><b class=\"spoiler_title\">Fr\u00e5ga<\/b><\/p>\n<pre><code class=\"plaintext\">V\u00c4LJ \n  id SOM snapshotid , \n  queryid ,\n  snapshot_timestamp , \n  shared_blks_read , \n  shared_blks_written \nFR\u00c5N \n  pg_stat_history\nD\u00c4R \n  queryid \u00c4R INTE NULL OCH \n  database_id = DATABASE_ID  OCH\n  snapshot_timestamp MELLAN BEGIN_TIMEPOINT OCH END_TIMEPOINT OCH\n  ( shared_blks_read &gt; 0 ELLER shared_blks_written &gt; 0 )\nORDNA EFTER 4 DESC  , 5 DESC \nBEGR\u00c4NSA 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 \u00f6ver f\u00f6rdelningen av f\u00f6rfr\u00e5gningar efter maximal k\u00f6tid<\/h4>\n<p><b class=\"spoiler_title\">F\u00f6rfr\u00e5gningar<\/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 \u00d6gonblicksbilder per fr\u00e5ga och sekund<\/h4>\n<p><b class=\"spoiler_title\">F\u00f6rfr\u00e5gningar<\/b><\/p>\n<pre><code class=\"plaintext\">--pg_qps.sql\n--Ber\u00e4kna fr\u00e5gor 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 'FEL - Hittade inte pg_stat_history f\u00f6r 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 sorterade efter QueryPerSeconds-nummer\n-----------------------------------------------------------------------------------------------------------------------------------------------\n|    #|          snapshot| snapshotID|      samtal|                      totalt dbtid|        QPS|                          I\/O-tid| I\/O-tid %\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>Timvis utf\u00f6randeshistorik med QueryPerSeconds och I\/O-tid<\/h4>\n<p><b class=\"spoiler_title\">Fr\u00e5ga<\/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| TIMHISTORIA F\u00d6R TIMME MED QueryPerSeconds och I\/O-tid\n-----------------------------------------------------------------------------------------------------------------------------------------------\n| HISTORIA F\u00d6R FR\u00c5GOR PER SEKUND\n|    #|          \u00f6gonblicksbild| \u00f6gonblicksbildID|      samtal|                      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>Texten av alla SQL-val<\/h4>\n<p><b class=\"spoiler_title\">Fr\u00e5ga<\/b><\/p>\n<pre><code class=\"plaintext\">V\u00c4LJ \n  queryid , \n  fr\u00e5ga \nFR\u00c5N \n  pg_stat_history\nD\u00c4R \n  queryid \u00c4R INTE NULL OCH \n  database_id = DATABASE_ID OCH\n  snapshot_timestamp MELLAN BEGIN_TIMEPOINT OCH END_TIMEPOINT\nGRUPPERA EFTER queryid , fr\u00e5ga\n<\/code><\/pre>\n<h2>Resultat<\/h2>\n<p>\nSom det framg\u00e5r, med ganska enkla medel kan man f\u00e5 en hel del anv\u00e4ndbar information om belastningen och tillst\u00e5ndet hos databasen. <\/p>\n<p><b>Anm\u00e4rkning:<\/b>Om vi registrar queryid i fr\u00e5gorna f\u00e5r vi historik per enskild fr\u00e5ga (f\u00f6r att spara utrymme har rapporterna f\u00f6r enskilda fr\u00e5gor utel\u00e4mnats).<\/p>\n<p>S\u00e5, statistiska data om fr\u00e5ga prestanda \u2014 finns och samlas in.<br \/>\nDet f\u00f6rsta steget \"insamling av statistikdata\" \u2014 \u00e4r avslutat.<\/p>\n<p>Vi kan g\u00e5 vidare till det andra steget - \"inst\u00e4llning av prestanda metriker\".<br \/>\n<img decoding=\"async\" alt=\"\u00d6vervakning av prestandan f\u00f6r PostgreSQL-fr\u00e5gor. Del 1 - rapportering\" src=\"\/wp-content\/uploads\/2019\/04\/a893e49280d4cb425e4667a5c51d2397.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Men det \u00e4r redan en helt annan historia.<\/b><\/p>\n<p><i>Forts\u00e4ttning f\u00f6ljer\u2026<\/i><br \/>\n<br \/>K\u00e4lla: <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\/sv\/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=\"sv_SE\" \/>\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\/sv\/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\udd47\u00d6vervakning av fr\u00e5ga prestanda i PostgreSQL. Del 1 \u2014 rapportering | ProHoster","description":"Ingenj\u00f6r \u2014 \u00f6versatt fr\u00e5n latin \u2014 inspirerad. Ingenj\u00f6ren kan allt. (c) R.Diesel. Epigraf.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/32353","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=32353"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/32353\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/24168"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=32353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=32353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=32353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}