{"id":38196,"date":"2019-10-31T22:22:13","date_gmt":"2019-10-31T19:22:13","guid":{"rendered":"https:\/\/prohoster.info\/blog\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql\/"},"modified":"2019-10-31T22:22:13","modified_gmt":"2019-10-31T19:22:13","slug":"odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql","title":{"rendered":"En af metoderne til at opn\u00e5 arbejdsbelastningsprofil og ventestudier i PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Forts\u00e6ttelse af artiklen &#171;<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/467181\/\">Fors\u00f8g p\u00e5 at skabe en tilsvarende ASH for PostgreSQL <\/a><\/noindex>&#171;.<\/p>\n<p>Artiklen vil unders\u00f8ge og vise med specifikke foresp\u00f8rgsler og eksempler \u2014 hvilken nyttig information man kan f\u00e5 ved hj\u00e6lp af visningen pg_stat_activity.<\/p>\n<blockquote><p>Advarsel.<br \/>\nP\u00e5 grund af emnets nyhed og den uafsluttede testperiode kan artiklen indeholde fejl. Kritik og kommentarer er meget velkomne og forventes.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Inddata<\/h2>\n<p><\/p>\n<h3>Historik for visningen pg_stat_statements<\/h3>\n<p>\n<b class=\"spoiler_title\">pg_stat_history<\/b><\/p>\n<pre><code class=\"pgsql\">CREATE TABLE pg_stat_history ( \nid SERIAL, \nsnapshot_timestamp  timestamp without time zone, \ndatabase_id integer,\ndbid oid,\nuserid oid,\nqueryid bigint,\nquery text,\ncalls bigint, \ntotal_time double precision, \nmin_time double precision, \nmax_time double precision, \nmean_time double precision,\nstddev_time double precision,\nrows bigint,\nshared_blks_hit bigint, \nshared_blks_read bigint, \nshared_blks_dirtied bigint, \nshared_blks_written bigint, \nlocal_blks_hit bigint, \nlocal_blks_read bigint,\nlocal_blks_dirtied bigint, \nlocal_blks_written bigint, \ntemp_blks_read bigint,\ntemp_blks_written bigint,\nblk_read_time double precision, \nblk_write_time double precision, \nbaseline_id integer );<\/code><\/pre>\n<p>\n Tabellen udfyldes hver time ved hj\u00e6lp af dblink til den m\u00e5lrettede database. Den mest interessante og nyttige kolonne i tabellen er selvf\u00f8lgelig <b>queryid<\/b>.<\/p>\n<h3>Historik for visningen pg_stat_activity<\/h3>\n<p>\n<b class=\"spoiler_title\">archive_pg_stat_activity<\/b><\/p>\n<pre><code class=\"pgsql\">CREATE TABLE archive_pg_stat_activity\n(\n  timepoint timestamp without time zone,\n  datid             oid, \n  datname           name,\n  pid               integer,\n  usesysid          oid,\n  usename           name,\n  application_name  text,\n  client_addr       inet,\n  client_hostname   text,\n  client_port       integer,\n  backend_start     timestamp without time zone,\n  xact_start        timestamp without time zone,\n  query_start       timestamp without time zone,\n  state_change      timestamp without time zone,\n  wait_event_type   text,                     \n  wait_event        text,                   \n  state             text,                  \n  backend_xid       xid,                 \n  backend_xmin      xid,                \n  query             text,               \n  backend_type      text,\n  queryid           bigint\n);<\/code><\/pre>\n<p>\nTabellen er en timeopdelt tabel for history_pg_stat_activity (L\u00e6s mere her \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/467277\/\">pg_stat_statements + pg_stat_activity + loq_query = pg_ash? <\/a><\/noindex> og her \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/467181\/\">Fors\u00f8g p\u00e5 at oprette en tilsvarende ASH for PostgreSQL.)<\/a><\/noindex><\/p>\n<h2>Output<\/h2>\n<p><\/p>\n<h3>CLUSTER CPU TIME (SYSTEM + CLIENTS )<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">WITH \n t AS\n (\n\tSELECT \t\t\n\t\t\tdate_trunc('second', timepoint)\n\tFROM \tactivity_hist.archive_pg_stat_activity aa\n\tWHERE \ttimepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour')  AND \n\t\t\t( aa.wait_event_type IS NULL  ) AND\n\t\t\taa.state = 'active'\n )\n SELECT count(*) \n INTO cpu_total\n FROM t ;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre><code class=\"plaintext\">CLUSTER CPU TIME (SYSTEM + CLIENTS ) : 28:37:46<\/code><\/pre>\n<p><\/p>\n<h3>CLUSTER WAITINGS TIME<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">WITH \n t AS\n (\n\tSELECT \t\t\n\t\t\tdate_trunc('second', timepoint)\n\tFROM \tactivity_hist.archive_pg_stat_activity aa\n\tWHERE \ttimepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour')  AND \n\t\t\t( aa.wait_event_type IS NOT NULL  ) AND\n\t\t\taa.state = 'active'\n )\n SELECT count(*) \n INTO cpu_total\n FROM t ;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre><code class=\"plaintext\">CLUSTER WAITINGS TIME : 30:12:49<\/code><\/pre>\n<p><\/p>\n<h3>Total pg_stat_statements v\u00e6rdier<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\"> --TOTAL pg_stat\n  V\u00c6LG \n    SUM(calls) AS calls, SUM(total_time)  AS total_time, SUM(rows) AS rows ,\n\tSUM(shared_blks_hit)  AS shared_blks_hit,SUM(shared_blks_read) AS shared_blks_read ,\n\tSUM(shared_blks_dirtied) AS shared_blks_dirtied,SUM(shared_blks_written) AS shared_blks_written , \n    SUM(local_blks_hit) AS local_blks_hit , SUM(local_blks_read) AS local_blks_read , \n\tSUM(local_blks_dirtied) AS local_blks_dirtied , SUM(local_blks_written)  AS local_blks_written,\n\tSUM(temp_blks_read) AS temp_blks_read, SUM(temp_blks_written) temp_blks_written , \n\tSUM(blk_read_time) AS blk_read_time , SUM(blk_write_time) AS blk_write_time\n  IND I \n    pg_total_stat_history_rec\n  FRA \n    pg_stat_history\n  HVOR \n \tsnapshot_timestamp MELLEM pg_stat_history_begin OG pg_stat_history_end OG \n\tqueryid ER NULL;<\/code><\/pre>\n<p><\/p>\n<h3>SQL DBTIME \u2014 total udf\u00f8relse af foresp\u00f8rgsler<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">dbtime_total = interval '1 millisecond' * pg_total_stat_history_rec.total_time ;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre><code class=\"plaintext\">SQL DBTIME : 136:49:36<\/code><\/pre>\n<p><\/p>\n<h3>SQL CPU TIME \u2014 CPU tid brugt til at udf\u00f8re foresp\u00f8rgsler<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">MED \n t SOM\n (\n\tV\u00c6LG \t\t\n\t\t\tdate_trunc('second', timepoint)\n\tFRA \tactivity_hist.archive_pg_stat_activity aa\n\tHVOR \ttimepoint MELLEM pg_stat_history_begin+(current_hour_diff * interval '1 hour') OG pg_stat_history_end+(current_hour_diff * interval '1 hour')  OG \n\t\t\t( aa.wait_event_type ER NULL  ) OG\n\t\t\tbackend_type = 'client backend' OG \n\t\t\taa.state = 'active'\n )\n V\u00c6LG count(*) \n IND I cpu_total\n FRA t ;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre><code class=\"plaintext\">SQL CPU TIME : 27:40:15<\/code><\/pre>\n<p><\/p>\n<h3>SQL WAITINGS TIME \u2014 total tid ventet for foresp\u00f8rgsler<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">MED \n t SOM\n (\n\tV\u00c6LG \t\t\n\t\t\tdate_trunc('second', timepoint)\n\tFRA \tactivity_hist.archive_pg_stat_activity aa\n\tHVOR \ttimepoint MELLEM pg_stat_history_begin+(current_hour_diff * interval '1 hour') OG pg_stat_history_end+(current_hour_diff * interval '1 hour')  OG \n\t\t\t( aa.wait_event_type ER IKKE NULL  ) OG\n\t\t\taa.state = 'active' OG \n\t\tbackend_type = 'client backend'\n )\n V\u00c6LG count(*) \n IND I waiting_total\n FRA t ;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre><code class=\"plaintext\">SQL WAITINGS TIME : 30:04:09<\/code><\/pre>\n<p>\nDe f\u00f8lgende foresp\u00f8rgsler er triviale, og for at spare plads undlades implementeringsdetaljerne:<\/p>\n<p><b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre><code class=\"plaintext\">| SQL IOTIME : 19:44:50\n| SQL READ TIME : 19:44:32\n| SQL WRITE TIME : 00:00:17\n|\n| SQL CALLS : 12188248\n-------------------------------------------------------------\n| SQL SHARED BLOCKS READS : 7997039120\n| SQL SHARED BLOCKS HITS : 8868286092\n| SQL SHARED BLOCKS HITS\/READS % : 110.89\n| SQL SHARED BLOCKS DIRTED : 419945\n| SQL SHARED BLOCKS WRITTEN : 19857\n|\n| SQL TEMPORARY BLOCKS READS : 7836169\n| SQL TEMPORARY BLOCKS WRITTEN : 10683938\n<\/code><\/pre>\n<p>\nVi g\u00e5r videre til den mest interessante sektion<\/p>\n<h2>WAITINGS STATISTIK<\/h2>\n<p><\/p>\n<h3>TOP 10 WAITINGS EFTER TOTAL WAIT TIME FOR KLIENTPROCESSES<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">V\u00c6LG \n  wait_event_type , wait_event ,\n  get_system_waiting_duration( wait_event_type , wait_event ,pg_stat_history_begin+(current_hour_diff * interval '1 hour') ,pg_stat_history_end+(current_hour_diff * interval '1 hour') ) som varighed \nFRA\n  activity_hist.archive_pg_stat_activity aa\nHVOR \n  timepoint MELLEM pg_stat_history_begin+(current_hour_diff * interval '1 hour') OG pg_stat_history_end+(current_hour_diff * interval '1 hour') OG backend_type != 'client backend' OG wait_event_type ER IKKE NULL \nGRUPPER EFTER \n  wait_event_type, wait_event\nORDNE EFTER 3 DESC\nBEGR\u00c6NS 10<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre>+------------------------------------------------------------------------------------\n| TOP 10 VENTETID TIL SYSTEMPROCESSER\n+-----+------------------------------+--------------------+--------------------\n|    #|               vent_event_type|          vent_event|            varighed\n+-----+------------------------------+--------------------+--------------------\n|    1|                      Activity| LogicalLauncherMain|            10:43:28\n|    2|                      Activity|      AutoVacuumMain|            10:42:49\n|    3|                      Activity|       WalWriterMain|            10:28:53\n|    4|                      Activity|    CheckpointerMain|            10:23:50\n|    5|                      Activity|        BgWriterMain|            09:11:59\n|    6|                      Activity|   BgWriterHibernate|            01:37:46\n|    7|                            IO|        BufFileWrite|            00:02:35\n|    8|                        LWLock|      buffer_mapping|            00:01:54\n|    9|                            IO|        DataFileRead|            00:01:23\n|   10|                            IO|            WALWrite|            00:00:59\n+-----+------------------------------+--------------------+--------------------\n<\/pre>\n<p><\/p>\n<h3>TOP 10 WAITINGS EFTER TOTAL WAIT TIME FOR KLIENTPROCESSES<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">V\u00c6LG \n  vent_event_type , vent_event ,\n  get_clients_waiting_duration( vent_event_type , vent_event , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) as varighed\nFRA \n  activity_hist.archive_pg_stat_activity aa\nHVOR \n  timepoint MELLEM pg_stat_history_begin+(current_hour_diff * interval '1 hour') OG pg_stat_history_end+(current_hour_diff * interval '1 hour') AND backend_type = 'client backend' AND vent_event_type IS IKKE NULL \nGRUPPER EFTER vent_event_type, vent_event\nORDNE EFTER 3 DESC\nBEGR\u00c6NSE 10<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre>+-----+------------------------------+--------------------+--------------------+----------\n|    #|               vent_event_type|          vent_event|            varighed|  % dbtid\n+-----+------------------------------+--------------------+--------------------+----------\n|    1|                          Lock|       transactionid|            08:16:47|      6.05\n|    2|                            IO|        DataFileRead|            06:13:41|      4.55\n|    3|                       Timeout|             PgSleep|            02:53:21|      2.11\n|    4|                        LWLock|      buffer_mapping|            00:40:42|       0.5\n|    5|                        LWLock|           buffer_io|            00:17:17|      0.21\n|    6|                            IO|        BufFileWrite|            00:01:34|      0.02\n|    7|                          Lock|               tuple|            00:01:32|      0.02\n|    8|                        Client|          ClientRead|            00:01:19|      0.02\n|    9|                            IO|         BufFileRead|            00:00:37|      0.01\n|   10|                        LWLock|      buffer_content|            00:00:08|         0\n+-----+------------------------------+--------------------+--------------------+----------\n<\/pre>\n<p><\/p>\n<h3>VENTETYPER EFTER TOTAL VENTETID FOR SYSTEMPROCESSER<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">V\u00c6LG \n  vent_event_type ,\n  get_system_waiting_type_duration( vent_event_type , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) as varighed\nFRA\n  activity_hist.archive_pg_stat_activity aa\nHVOR \n  timepoint MELLEM pg_stat_history_begin+(current_hour_diff * interval '1 hour') OG pg_stat_history_end+(current_hour_diff * interval '1 hour') AND  backend_type != 'client backend' AND vent_event_type IS IKKE NULL \nGRUPPER EFTER vent_event_type\nORDNE EFTER 2 DESC<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre>+-----+------------------------------+--------------------\n|    #|               wait_event_type|            varighed\n+-----+------------------------------+--------------------\n|    1|                      Aktivitet|            53:08:45\n|    2|                            IO|            00:06:24\n|    3|                        LWLock|            00:03:02\n+-----+------------------------------+--------------------\n<\/pre>\n<p><\/p>\n<h3> VENTTYPER EFTER TOTAL VENTETID FOR KLIENTPROCESSER<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">V\u00c6LG \n  wait_event_type ,\n  get_clients_waiting_type_duration( wait_event_type , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) AS varighed\nFRA\n  activity_hist.archive_pg_stat_activity aa\nHVOR \n  timepoint MELLEM pg_stat_history_begin+(current_hour_diff * interval '1 hour') OG pg_stat_history_end+(current_hour_diff * interval '1 hour') OG backend_type = 'client backend' OG wait_event_type ER IKKE NULL \nGROUP BY wait_event_type\nORDER BY 2 DESC<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre>+-----+------------------------------+--------------------+--------------------\n|    #|               wait_event_type|            varighed|            % dbtid\n+-----+------------------------------+--------------------+--------------------\n|    1|                          L\u00e5s|            08:18:19|                6.07\n|    2|                            IO|            06:16:01|                4.58\n|    3|                       Timeout|            02:53:21|                2.11\n|    4|                        LWLock|            00:58:12|                0.71\n|    5|                        Klient|            00:01:19|                0.02\n|    6|                           IPC|            00:00:04|                   0\n+-----+------------------------------+--------------------+--------------------\n<\/pre>\n<p>\nVentetider for systemprocesser og enkelte foresp\u00f8rgsler.<\/p>\n<h3>VENTER FOR SYSTEMPROCESSER<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">V\u00c6LG \n  backend_type , datname , wait_event_type , wait_event , get_backend_type_waiting_duration( backend_type , wait_event_type , wait_event , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) AS varighed \nFRA \n  activity_hist.archive_pg_stat_activity aa\nHVOR \n  timepoint MELLEM pg_stat_history_begin+(current_hour_diff * interval '1 hour') OG pg_stat_history_end+(current_hour_diff * interval '1 hour') OG backend_type != 'client backend' OG wait_event_type ER IKKE NULL \nGROUP BY backend_type , datname , wait_event_type , wait_event\nORDER BY 5 DESC<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre>+-----+-----------------------------+----------+--------------------+----------------------+--------------------\n|    #|                 backend_type|    dbname|     wait_event_type|            wait_event|            duration\n+-----+-----------------------------+----------+--------------------+----------------------+--------------------\n|    1| logical replication launcher|          |            Aktivitet|   LogicalLauncherMain|            10:43:28\n|    2|          autovacuum launcher|          |            Aktivitet|        AutoVacuumMain|            10:42:49\n|    3|                    walwriter|          |            Aktivitet|         WalWriterMain|            10:28:53\n|    4|                 checkpointer|          |            Aktivitet|      CheckpointerMain|            10:23:50\n|    5|            background writer|          |            Aktivitet|          BgWriterMain|            09:11:59\n|    6|            background writer|          |            Aktivitet|     BgWriterHibernate|            01:37:46\n|    7|              parallel worker|      tdb1|                  IO|          BufFileWrite|            00:02:35\n|    8|              parallel worker|      tdb1|              LWLock|        buffer_mapping|            00:01:41\n|    9|              parallel worker|      tdb1|                  IO|          DataFileRead|            00:01:22\n|   10|              parallel worker|      tdb1|                  IO|           BufFileRead|            00:00:59\n|   11|                    walwriter|          |                  IO|              WALWrite|            00:00:57\n|   12|              parallel worker|      tdb1|              LWLock|             buffer_io|            00:00:47\n|   13|            autovacuum worker|      tdb1|              LWLock|        buffer_mapping|            00:00:13\n|   14|            background writer|          |                  IO|         DataFileWrite|            00:00:12\n|   15|                 checkpointer|          |                  IO|         DataFileWrite|            00:00:11\n|   16|                    walwriter|          |              LWLock|          WALWriteLock|            00:00:09\n|   17|                 checkpointer|          |              LWLock|          WALWriteLock|            00:00:06\n|   18|            background writer|          |              LWLock|          WALWriteLock|            00:00:06\n|   19|                    walwriter|          |                  IO|          WALInitWrite|            00:00:02\n|   20|            autovacuum worker|      tdb1|              LWLock|          WALWriteLock|            00:00:02\n|   21|                    walwriter|          |                  IO|           WALInitSync|            00:00:02\n|   22|            autovacuum worker|      tdb1|                  IO|          DataFileRead|            00:00:01\n|   23|                 checkpointer|          |                  IO| ControlFileSyncUpdate|            00:00:01\n|   24|            background writer|          |                  IO|              WALWrite|            00:00:01\n|   25|            background writer|          |                  IO|         DataFileFlush|            00:00:01\n|   26|                 checkpointer|          |                  IO|         SLRUFlushSync|            00:00:01\n|   27|            autovacuum worker|      tdb1|                  IO|              WALWrite|            00:00:01\n|   28|                 checkpointer|          |                  IO|          DataFileSync|            00:00:01\n+-----+-----------------------------+----------+--------------------+----------------------+--------------------<\/pre>\n<p><\/p>\n<h3>VENTER FOR SQL \u2014 ventetider for individuelle foresp\u00f8rgsler efter queryid<\/h3>\n<p>\n<b class=\"spoiler_title\">Foresp\u00f8rgsel<\/b><\/p>\n<pre><code class=\"pgsql\">V\u00c6LG \nqueryid, datname, wait_event_type, wait_event, get_query_waiting_duration( queryid, wait_event_type, wait_event, pg_stat_history_begin+(current_hour_diff * interval '1 hour'), pg_stat_history_end+(current_hour_diff * interval '1 hour')) som varighed \nFRA \n  activity_hist.archive_pg_stat_activity aa\nHVOR \n  timepoint MELLEM pg_stat_history_begin+(current_hour_diff * interval '1 hour') OG pg_stat_history_end+(current_hour_diff * interval '1 hour') OG backend_type = 'client backend' OG wait_event_type ER IKKE NULL OG queryid ER IKKE NULL \nGRUPPER EFTER queryid, datname, wait_event_type, wait_event\nORDN EN 1, 5 DESC <\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Eksempel<\/b><\/p>\n<pre>+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------\n|    #|                  queryid|    dbname|     wait_event_type|          wait_event|            waitings|               total\n|     |                         |          |                    |                    |            duration|            duration\n+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------\n|    1|     -8247416849404883188|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:02|\n|    2|     -6572922443698419129|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:05|\n|    3|     -6572922443698419129|      tdb1|                  IO|        DataFilL\u00e6sning|            00:00:01|\n|    4|     -5917408132400665328|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:04|\n|    5|     -4091009262735781873|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:03|\n|    6|     -1473395109729441239|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:01|\n|    7|        28942442626229688|      tdb1|                  IO|        BufFilSkrivning|            00:01:34|            00:46:06\n|    8|        28942442626229688|      tdb1|              LWLock|      buffer_mapping|            00:01:05|            00:46:06\n|    9|        28942442626229688|      tdb1|                  IO|        DataFilL\u00e6sning|            00:00:44|            00:46:06\n|   10|        28942442626229688|      tdb1|                  IO|         BufFilL\u00e6sning|            00:00:37|            00:46:06\n|   11|        28942442626229688|      tdb1|              LWLock|           buffer_io|            00:00:35|            00:46:06\n|   12|        28942442626229688|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:05|            00:46:06\n|   13|        28942442626229688|      tdb1|                 IPC| ModtagelseAfBeskedk\u00f8|            00:00:03|            00:46:06\n|   14|        28942442626229688|      tdb1|                 IPC|    BgWorkerLukning|            00:00:01|            00:46:06\n|   15|       389015618226997618|      tdb1|                Lock|       transaktionsid|            03:55:09|            04:14:15\n|   16|       389015618226997618|      tdb1|                  IO|        DataFilL\u00e6sning|            03:23:09|            04:14:15\n|   17|       389015618226997618|      tdb1|              LWLock|      buffer_mapping|            00:12:09|            04:14:15\n|   18|       389015618226997618|      tdb1|              LWLock|           buffer_io|            00:10:18|            04:14:15\n|   19|       389015618226997618|      tdb1|                Lock|               tuple|            00:00:35|            04:14:15\n|   20|       389015618226997618|      tdb1|              LWLock|        WALSkrivL\u00e5s|            00:00:02|            04:14:15\n|   21|       389015618226997618|      tdb1|                  IO|       DataFilSkrivning|            00:00:01|            04:14:15\n|   22|       389015618226997618|      tdb1|              LWLock|        SyncScanLock|            00:00:01|            04:14:15\n|   23|       389015618226997618|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:01|            04:14:15\n|   24|       734234407411547467|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:11|\n|   25|       734234407411547467|      tdb1|              LWLock|      buffer_mapping|            00:00:05|\n|   26|       734234407411547467|      tdb1|                  IO|        DataFilL\u00e6sning|            00:00:02|\n|   27|      1237430309438971376|      tdb1|              LWLock|      buffer_mapping|            00:02:18|            02:45:40\n|   28|      1237430309438971376|      tdb1|                  IO|        DataFilL\u00e6sning|            00:00:27|            02:45:40\n|   29|      1237430309438971376|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:02|            02:45:40\n|   30|      2404820632950544954|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:01|\n|   31|      2515308626622579467|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:02|\n|   32|      4710212362688288619|      tdb1|              LWLock|      buffer_mapping|            00:03:08|            02:18:21\n|   33|      4710212362688288619|      tdb1|                  IO|        DataFilL\u00e6sning|            00:00:22|            02:18:21\n|   34|      4710212362688288619|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:06|            02:18:21\n|   35|      4710212362688288619|      tdb1|              LWLock|           buffer_io|            00:00:02|            02:18:21\n|   36|      9150846928388977274|      tdb1|                  IO|        DataFilL\u00e6sning|            00:01:19|\n|   37|      9150846928388977274|      tdb1|              LWLock|      buffer_mapping|            00:00:34|\n|   38|      9150846928388977274|      tdb1|              Klient|          KlientL\u00e6sning|            00:00:10|\n|   39|      9150846928388977274|      tdb1|              LWLock|           buffer_io|            00:00:01|\n+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------<\/pre>\n<p><\/p>\n<h3>KLIENT SQL STATISTIKKER \u2014 TOP foresp\u00f8rgsler<\/h3>\n<p>\nForesp\u00f8rgslerne til at hente er igen trivielle og er ikke angivet for at spare plads. <\/p>\n<p><b class=\"spoiler_title\">Eksempler<\/b><\/p>\n<pre>+------------------------------------------------------------------------------------\n| KLAR SQL sorteret efter forl\u00f8betid\n+--------------------+----------+----------+----------+----------+----------+--------------------\n|        forl\u00f8betid|     kald|  % dbtid|     % CPU|      % IO|    dbnavn|             foresp\u00f8rgselsid\n+--------------------+----------+----------+----------+----------+----------+--------------------\n|            04:14:15|        19|       3.1|     10.83|     11.52|      tdb1|  389015618226997618\n|            02:45:40|       746|      2.02|      4.23|      0.08|      tdb1| 1237430309438971376\n|            02:18:21|       749|      1.69|      3.39|       0.1|      tdb1| 4710212362688288619\n|            00:46:06|       375|      0.56|      0.94|      0.41|      tdb1|   28942442626229688\n+--------------------+----------+----------+----------+----------+----------+--------------------\n| KLAR SQL sorteret efter CPU-tid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|            cpu-tid|     kald|  % dbtid|total_time|     % CPU|      % IO|    dbnavn|             foresp\u00f8rgselsid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|            02:59:49|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618\n|            01:10:12|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376\n|            00:56:15|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619\n|            00:15:35|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n| KLAR SQL sorteret efter Bruger I\/O Ventetid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|        io_ventetid|     kald|  % dbtid|total_time|     % CPU|      % IO|    dbnavn|             foresp\u00f8rgselsid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|            03:23:10|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618\n|            00:02:54|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688\n|            00:00:27|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376\n|            00:00:22|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n| KLAR SQL sorteret efter Delte Buffere L\u00e6sninger\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|       buffer l\u00e6sninger|     kald|  % dbtid|total_time|     % CPU|      % IO|    dbnavn|             foresp\u00f8rgselsid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|          1056388566|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618\n|            11709251|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688\n|             3439004|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376\n|             3373330|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n| KLAR SQL sorteret efter Disk L\u00e6setid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|           l\u00e6setid|     kald|  % dbtid|total_time|     % CPU|      % IO|    dbnavn|             foresp\u00f8rgselsid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|            02:16:30|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618\n|            00:04:50|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688\n|            00:01:10|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619\n|            00:00:57|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n| KLAR SQL sorteret efter K\u00f8rsel\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|               kald|      r\u00e6kker|  % dbtid|total_time|     % CPU|      % IO|    dbnavn|             foresp\u00f8rgselsid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|                 749|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619\n|                 746|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376\n|                 375|         0|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688\n|                  19|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------<\/pre>\n<p><\/p>\n<h2>Resultat<\/h2>\n<p>\nVed at bruge de pr\u00e6senterede foresp\u00f8rgsler og den genererede rapportering kan man f\u00e5 et mere fyldigt billede til analyse og l\u00f8sning af problemer med pr\u00e6stationsdegradation for enkeltforesp\u00f8rgsler samt hele klyngen som helhed.<\/p>\n<h2>Udvikling<\/h2>\n<p>\nPlanerne for udvikling er f\u00f8lgende:<\/p>\n<ul>\n<li>At supplere rapporteringen med en historie om l\u00e5sning. Foresp\u00f8rgsler er under test og vil blive pr\u00e6senteret inden for kort tid.<\/li>\n<li>At bruge TimescaleDB-udvidelsen til at gemme historikken for pg_stat_activity og pg_locks.<\/li>\n<li>At forberede en batchl\u00f8sning p\u00e5 GitHub til masseimplementering p\u00e5 produktionsdatabaser.<\/li>\n<\/ul>\n<p>\nForts\u00e6tter\u2026<br \/>\n<br \/>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/467575\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 &#171;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 ASH \u0434\u043b\u044f PostgreSQL &#171;. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u2014 \u043a\u0430\u043a\u0443\u044e \u0436\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f pg_stat_activity. \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043d\u043e\u0432\u0438\u0437\u043d\u043e\u0439 \u0442\u0435\u043c\u044b \u0438 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438. \u041a\u0440\u0438\u0442\u0438\u043a\u0430 \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0432\u0441\u044f\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f \u0438 \u043e\u0436\u0438\u0434\u0430\u044e\u0442\u0441\u044f. \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38196","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 &quot;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 ASH \u0434\u043b\u044f PostgreSQL &quot;. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0438.\" \/>\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\/da\/blog\/administrirovanie\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\u041e\u0434\u0438\u043d \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 \u0432 PostgreSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 &quot;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 ASH \u0434\u043b\u044f PostgreSQL &quot;. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql\" \/>\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-31T19:22:13+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:22:13+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\udd47En af metoderne til at indhente arbejdsbelastningsprofil og ventetidshistorik i PostgreSQL | ProHoster","description":"Forts\u00e6ttelse af artiklen \"Fors\u00f8g p\u00e5 at skabe en analog ASH til PostgreSQL\". Artiklen vil tage fat p\u00e5 og vise konkrete foresp\u00f8rgsler og.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\u041e\u0434\u0438\u043d \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 \u0432 PostgreSQL | ProHoster","og:description":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 &quot;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 ASH \u0434\u043b\u044f PostgreSQL &quot;. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0438.","og:url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql","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-31T19:22:13+00:00","article:modified_time":"2019-10-31T19:22:13+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38196","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-23 20:52:50","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:13:23","updated":"2026-01-23 20:52:50","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/38196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=38196"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/38196\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=38196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=38196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=38196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}