{"id":79467,"date":"2020-04-27T07:42:23","date_gmt":"2020-04-27T05:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/operativnaya-analitika-v-mikroservisnoj-arhitekture-p%cc%b6o%cc%b6n%cc%b6ya%cc%b6t%cc%b6%cc%b6-%cc%b6i%cc%b6-%cc%b6p%cc%b6r%cc%b6o%cc%b6s%cc%b6t%cc%b6i%cc%b6t%cc%b6%cc%b6-pomoch-i-podskazat-postgres"},"modified":"2020-04-27T07:42:23","modified_gmt":"2020-04-27T05:42:23","slug":"operativnaya-analitika-v-mikroservisnoj-arhitekture-p%cc%b6o%cc%b6n%cc%b6ya%cc%b6t%cc%b6%cc%b6-%cc%b6i%cc%b6-%cc%b6p%cc%b6r%cc%b6o%cc%b6s%cc%b6t%cc%b6i%cc%b6t%cc%b6%cc%b6-pomoch-i-podskazat-postgres","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/operativnaya-analitika-v-mikroservisnoj-arhitekture-p%cc%b6o%cc%b6n%cc%b6ya%cc%b6t%cc%b6%cc%b6-%cc%b6i%cc%b6-%cc%b6p%cc%b6r%cc%b6o%cc%b6s%cc%b6t%cc%b6i%cc%b6t%cc%b6%cc%b6-pomoch-i-podskazat-postgres","title":{"rendered":"Operatiivanal\u00fc\u00fctika mikrotehnoloogia arhitektuuris: p\u0336o\u0336n\u0336y\u0336a\u0336t\u0336'\u0336 \u0336i\u0336 \u0336p\u0336r\u0336o\u0336s\u0336t\u0336i\u0336t\u0336'\u0336: \u0336aidata ja n\u00f5ustada Postgres FDW","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Mikroteenused arhitektuur, nagu k\u00f5ik maailmas, omab oma plusse ja miinuseid. M\u00f5ned protsessid muutuvad selle abil lihtsamaks, teised aga keerukamaks. Kiiremate muudatuste ja parema skaleeritavuse nimel tuleb teha ohverdusi. \u00dcks neist on anal\u00fc\u00fcsi keerukuse suurenemine. Kui monoliitses l\u00e4henemises saab kogu operatiivanal\u00fc\u00fcsi kokku v\u00f5tta SQL-p\u00e4ringuteks anal\u00fc\u00fctilisele koopiale, siis mikroteenuste arhitektuuris on iga teenuse jaoks eraldi andmebaas ja n\u00e4ib, et \u00fche p\u00e4ringuga ei saa hakkama (aga v\u00f5ib-olla saab?). Neile, keda huvitab, kuidas me oma ettev\u00f5ttes operatiivanal\u00fc\u00fcsi probleemi lahendasime ja kuidas me sellega kohanema \u00f5ppisime \u2014 tere tulemast.<\/p>\n<p><img decoding=\"async\" alt=\"Operatiivanal\u00fc\u00fctika mikrotehnoloogia arhitektuuris: p\u0336o\u0336n\u0336y\u0336a\u0336t\u0336&#039;\u0336 \u0336i\u0336 \u0336p\u0336r\u0336o\u0336s\u0336t\u0336i\u0336t\u0336&#039;\u0336: \u0336aidata ja n\u00f5ustada Postgres FDW\" src=\"\/wp-content\/uploads\/2020\/04\/4296389f06d488999cc023dcaa3027f7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMinu nimi on Pavel Sivash, DomKlikis t\u00f6\u00f6tan meeskonnas, mis vastutab andmeanal\u00fc\u00fctika laohaldamise eest. \u00dcldiselt v\u00f5ib meie tegevust nimetada andmeinseneri t\u00f6\u00f6ks, kuid tegelikult on \u00fclesannete ulatus palju laiem. On olemas andmeinsenerile standardsed ETL\/ELT, t\u00f6\u00f6riistade toetamine ja kohandamine andmeanal\u00fc\u00fcsi jaoks ning meie enda t\u00f6\u00f6riistade arendamine. Eelk\u00f5ige operatiivsete aruannete jaoks otsustasime \"teha n\u00e4gu, et meil on monoliit\" ja anda anal\u00fc\u00fctikutele \u00fcks andmebaas, kus on k\u00f5ik vajalikud andmed. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Oleme t\u00f5epoolest kaalunud erinevaid variante. Me oleksime v\u00f5inud ehitada t\u00e4ieliku andmelao \u2014 me isegi proovime, aga ausalt \u00f6eldes ei \u00f5nnestunud meil piisavalt kiiresti muutuvaid loogikaid kohandada aeglase andmelao ehitamise ja seal muudatuste tegemisega (kui kellelgi on \u00f5nnestunud, kirjutage kommentaarides, kuidas). Me oleksime v\u00f5inud \u00f6elda anal\u00fc\u00fctikutele: \"Poiss, \u00f5ppige pythonit ja minge anal\u00fc\u00fctilistele replikatele\", aga see oleks t\u00e4hendanud, et peame tegema lisavaate inimeste valikule, ja tundus, et seda v\u00f5iks v\u00e4ltida, kui v\u00f5imalik. Otsustasime proovida tehnoloogiat FDW (Foreign Data Wrapper): p\u00f5him\u00f5tteliselt on see standardne dblink, mis on olemas SQL standardis, kuid oma palju mugavama liidese kaudu. Selle alusel t\u00f5ime v\u00e4lja lahenduse, mis l\u00f5puks juurdus, ja sellele me j\u00e4\u00e4me. Selle detailsed aspektid on eraldi artikli teema, v\u00f5ib-olla isegi mitte \u00fche, kuna on palju, millest r\u00e4\u00e4kida: andmebaasi skeemide s\u00fcnkroniseerimisest kuni juurdep\u00e4\u00e4su haldamise ja isikuandmete deanon\u00fc\u00fcmimisega. Samuti tuleb m\u00e4rkida, et see lahendus ei asenda tegelikke anal\u00fc\u00fctilisi andmebaase ja andmelaosid, see lahendab ainult kindla probleemi.<\/p>\n<p>\u00dcldiselt n\u00e4eb see v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"Operatiivanal\u00fc\u00fctika mikrotehnoloogia arhitektuuris: p\u0336o\u0336n\u0336y\u0336a\u0336t\u0336&#039;\u0336 \u0336i\u0336 \u0336p\u0336r\u0336o\u0336s\u0336t\u0336i\u0336t\u0336&#039;\u0336: \u0336aidata ja n\u00f5ustada Postgres FDW\" src=\"\/wp-content\/uploads\/2020\/04\/574da29dfdb40706afe9e817e789a61b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOn PostgreSQL andmebaas, kus kasutajad saavad hoida oma t\u00f6\u00f6andmeid, ja mis veelgi olulisem \u2013 sellele andmebaasile on FDW kaudu \u00fchendatud k\u00f5ik teenuste anal\u00fc\u00fctilised koopiad. See v\u00f5imaldab esitada p\u00e4ringut mitmele andmebaasile s\u00f5ltumata sellest, kas need on PostgreSQL, MySQL, MongoDB v\u00f5i midagi muud (fail, API, kui sobivat wrapperit ei ole, saab kirjutada oma). Noh, tundub, et k\u00f5ik on h\u00e4sti! Kas me v\u00f5ime lahkuda?<\/p>\n<p>Kui k\u00f5ik l\u00f5ppeks nii kiiresti ja lihtsalt, siis ilmselt poleks seda artiklit olemas.<\/p>\n<p>On oluline selgelt m\u00f5ista, kuidas PostgreSQL k\u00e4sitleb p\u00e4ringuid kaugserverite suhtes. See tundub loogiline, kuid sageli ei p\u00f6\u00f6rata sellele t\u00e4helepanu: PostgreSQL jagab p\u00e4ringu osadeks, mis t\u00e4idetakse kaugserverites iseseisvalt, kogub need andmed ja l\u00f5puks teeb l\u00f5plikud arvestused juba ise, seega s\u00f5ltub p\u00e4ringu t\u00e4itmise kiirus oluliselt sellest, kuidas see on kirjutatud. Samuti tuleks m\u00e4rkida: kui andmed tulevad kaugserverist, ei ole neil enam indekseid, pole midagi, mis aitaks planeerijal, seega saame aidata ja suunata teda ainult meie ise. Ja just sellest tahaksin l\u00e4hemalt r\u00e4\u00e4kida.<\/p>\n<h1>Lihtne p\u00e4ring ja plaan selle jaoks<\/h1>\n<p>\nN\u00e4itamaks, kuidas Postgres t\u00e4idab p\u00e4ringut 6 miljoni reaga tabelile, <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/et\/server\/dts-dronten\/\"   title=\"serveril\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2589\">serveril<\/a>, uurime lihtsat plaani.<\/p>\n<pre><code class=\"sql\">explain analyze verbose  \nSELECT count(1)\nFROM fdw_schema.table;\n\nAggregate  (cost=418383.23..418383.24 rows=1 width=8) (actual time=3857.198..3857.198 rows=1 loops=1)\n  Output: count(1)\n  -&gt;  Foreign Scan on fdw_schema.&quot;table&quot;  (cost=100.00..402376.14 rows=6402838 width=0) (actual time=4.874..3256.511 rows=6406868 loops=1)\n        Output: &quot;table&quot;.id, &quot;table&quot;.is_active, &quot;table&quot;.meta, &quot;table&quot;.created_dt\n        Remote SQL: SELECT NULL FROM fdw_schema.table\nPlanning time: 0.986 ms\nExecution time: 3857.436 ms<\/code><\/pre>\n<p>\nVERBOSE k\u00e4skluse kasutamine v\u00f5imaldab n\u00e4ha p\u00e4ringut, mis saadetakse kaugs\u00fcsteemile, ning tulemusi, mida me edasiseks t\u00f6\u00f6tlemiseks saame (venna RemoteSQL).<\/p>\n<p>Vaatame veidi edasi ja lisame meie p\u00e4ringusse m\u00f5ned filtrid: \u00fcks <b>boolean<\/b> v\u00e4lja p\u00f5hjal, \u00fcks sissetoomise p\u00f5hjal <b>timestamp<\/b> vahemikku ja \u00fcks <b>jsonb<\/b>.<\/p>\n<pre><code class=\"sql\">selgitama anal\u00fc\u00fcsi \u00fcksikasjalikult\nVALI count(1)\nFROM fdw_schema.table \nKUS is_active on T\u00f5si\nJA created_dt BETWEEN CURRENT_DATE - INTERVAL '7 kuud' \nJA CURRENT_DATE - INTERVAL '6 kuud'\nJA meta-&gt;&gt;'source' = 'test';\n\nKogum (maksumus=577487.69..577487.70 read=1 laius=8) (reaalne aeg=27473.818..25473.819 read=1 ts\u00fcklites=1)\n  V\u00e4ljund: count(1)\n  -&gt;  V\u00e4lismaise skaneerimise jaoks fdw_schema.&quot;table&quot;  (maksumus=100.00..577469.21 read=7390 laius=0) (reaalne aeg=31.369..25372.466 read=1360025 ts\u00fcklites=1)\n        V\u00e4ljund: &quot;table&quot;.id, &quot;table&quot;.is_active, &quot;table&quot;.meta, &quot;table&quot;.created_dt\n        Filter: ((&quot;table&quot;.is_active ON T\u00d5SI) JA ((&quot;table&quot;.meta -&gt;&gt; 'source'::text) = 'test'::text) JA (&quot;table&quot;.created_dt &gt;= (('n\u00fc\u00fcd'::cstring)::kuup\u00e4ev - '7 kuud'::intervall)) JA (&quot;table&quot;.created_dt &lt;= ((('n\u00fc\u00fcd'::cstring)::kuup\u00e4ev)::aeg tsoonis - '6 kuud'::intervall)))\n        Ridade eemaldamine filtrist: 5046843\n        Kaug-SQL: VALI created_dt, is_active, meta FROM fdw_schema.table\nPlaneerimise aeg: 0.665 ms\nT\u00e4ideviimise aeg: 27474.118 ms<\/code><\/pre>\n<p>\nJust siin peitub hetk, millele tuleb p\u00f6\u00f6rata t\u00e4helepanu p\u00e4ringute koostamisel. Filtrid ei edastatud kaugs\u00f5lmele, mis t\u00e4hendab, et Postgres t\u00f5mbab v\u00e4lja k\u00f5ik 6 miljonit rida, et seej\u00e4rel kohapeal filtreerida (rida Filter) ja teostada agregatsiooni. Edu v\u00f5ti on koostada p\u00e4ring nii, et filtrid edastataks kaugs\u00f5lmele ning me saaksime ja agregiseeriksime vaid vajalikud read. <\/p>\n<h1>See on t\u00f5eliselt imelik<\/h1>\n<p>\nBoolean v\u00e4liidega \u2014 k\u00f5ik on lihtne. Algses p\u00e4ringus tekkis probleem operaatorist <b>is<\/b>. Kui asendada see <b>=<\/b>, siis saame j\u00e4rgmise tulemuse:<\/p>\n<pre><code class=\"sql\">explain analyze verbose\nSELECT count(1)\nFROM fdw_schema.table\nWHERE is_active = True\nAND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' \nAND CURRENT_DATE - INTERVAL '6 month'\nAND meta-&gt;&gt;'source' = 'test';\n\nAggregate  (cost=508010.14..508010.15 rows=1 width=8) (actual time=19064.314..19064.314 rows=1 loops=1)\n  Output: count(1)\n  -&gt;  Foreign Scan on fdw_schema.\"table\"  (cost=100.00..507988.44 rows=8679 width=0) (actual time=33.035..18951.278 rows=1360025 loops=1)\n        Output: \"table\".id, \"table\".is_active, \"table\".meta, \"table\".created_dt\n        Filter: (((\"table\".meta -&gt;&gt; 'source'::text) = 'test'::text) AND (\"table\".created_dt &gt;= (('now'::cstring)::date - '7 mons'::interval)) AND (\"table\".created_dt &lt;= (((&#039;now&#039;::cstring)::date)::timestamp with time zone - &#039;6 mons&#039;::interval)))\n        Rows Removed by Filter: 3567989\n        Remote SQL: SELECT created_dt, meta FROM fdw_schema.table WHERE (is_active)\nPlanning time: 0.834 ms\nExecution time: 19064.534 ms<\/code><\/pre>\n<p>\nNagu n\u00e4ete, filter viidi kaugserverisse ja t\u00e4itmise aeg v\u00e4henes 27-lt 19 sekundile. <\/p>\n<p>On oluline m\u00e4rkida, et operaator <b>is<\/b> erineb operaatorist <b>=<\/b> selle poolest, et suudab t\u00f6\u00f6tada Null v\u00e4\u00e4rtusega. See t\u00e4hendab, et <b>is not True<\/b> filtris j\u00e4\u00e4vad v\u00e4\u00e4rtused False ja Null, samas kui <b>!= True<\/b> j\u00e4tab alles ainult v\u00e4\u00e4rtused False. Seet\u00f5ttu operaatori asendamisel <b>is not<\/b> filterisse tuleb edastada kaks tingimust OR operaatoriga, n\u00e4iteks <b>WHERE (col != True) OR (col is null)<\/b>.<\/p>\n<p>Oleme boolean'iga selgeks saanud, liigume edasi. Samas viime filtri algsesse vormi, et eraldi vaadata, kuidas teised muutused m\u00f5juvad.<\/p>\n<h1>timestamptz? hz<\/h1>\n<p>\nTegelikult tuleb tihti katsetada, kuidas \u00f5igesti kirjutada p\u00e4ring, milles osalevad kaugserverid, ja alles siis otsida seletust, miks see nii toimub. Internetis on selle kohta v\u00e4ga v\u00e4he teavet. Katsetuste k\u00e4igus avastasime, et fikseeritud kuup\u00e4eva filter t\u00f6\u00f6tab kaugserveris kenasti, aga kui tahame kuup\u00e4eva m\u00e4\u00e4rata d\u00fcnaamiliselt, n\u00e4iteks now() v\u00f5i CURRENT_DATE, siis see nii ei toimu. Meie n\u00e4ites lisasime sellise filtri, et veerg created_at sisaldaks andmeid t\u00e4pselt 1 kuu tagasi (BETWEEN CURRENT_DATE \u2014 INTERVAL '7 month' AND CURRENT_DATE \u2014 INTERVAL '6 month'). Mida me sellisel juhul ette v\u00f5tsime?<\/p>\n<pre><code class=\"sql\">selgitada anal\u00fc\u00fcsi n\u00f5u\nSELECT count(1)\nFROM fdw_schema.table \nWHERE is_active is True\nAND created_dt &gt;= (SELECT CURRENT_DATE::timestamptz - INTERVAL '7 month') \nAND created_dt &gt;'source' = 'test';\n\nKogus  (kulu=306875.17..306875.18 read=1 laius=8) (reaalne aeg=4789.114..4789.115 read=1 ts\u00fcklis=1)\n  V\u00e4ljund: count(1)\n  InitPlan 1 (tagastab $0)\n    -&gt;  Tulemused  (kulu=0.00..0.02 read=1 laius=8) (reaalne aeg=0.007..0.008 read=1 ts\u00fcklis=1)\n          V\u00e4ljund: ((('now'::cstring)::date)::timestamp with time zone - '7 mons'::interval)\n  InitPlan 2 (tagastab $1)\n    -&gt;  Tulemused  (kulu=0.00..0.02 read=1 laius=8) (reaalne aeg=0.002..0.002 read=1 ts\u00fcklis=1)\n          V\u00e4ljund: ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)\n  -&gt;  Kaugete skannimine fdw_schema.\"table\"  (kulu=100.02..306874.86 read=105 laius=0) (reaalne aeg=23.475..4681.419 read=1360025 ts\u00fcklis=1)\n        V\u00e4ljund: \"table\".id, \"table\".is_active, \"table\".meta, \"table\".created_dt\n        Filter: ((\"table\".is_active IS TRUE) AND ((\"table\".meta -&gt;&gt; 'source'::text) = 'test'::text))\n        Ridu on eemaldatud filteri j\u00e4rgi: 76934\n        Kauge SQL: SELECT is_active, meta FROM fdw_schema.table WHERE ((created_dt &gt;= $1::timestamp with time zone)) AND ((created_dt &lt; $2::timestamp with time zone))\nPlaneerimise aeg: 0.703 ms\nT\u00e4ideviimise aeg: 4789.379 ms<\/code><\/pre>\n<p>\nMe soovisime, et planeerija arvutaks kuup\u00e4eva eelnevalt allp\u00e4ringus ja edastaks juba valminud muutujat filtrisse. Ja see soovitus andis meile suurep\u00e4rase tulemuse, p\u00e4ring kiirus t\u00f5usis peaaegu 6 korda!<\/p>\n<p>Oluline on olla t\u00e4helepanelik: alamk\u00fcsitluse andmet\u00fc\u00fcp peab olema sama, mis filtritava v\u00e4lja t\u00fc\u00fcp, vastasel juhul otsustab planeerija, et kuna t\u00fc\u00fcbid on erinevad, tuleb esmalt andmed k\u00e4tte saada ja seej\u00e4rel kohalikult filtreerida.<\/p>\n<p>Tagastame kuup\u00e4evafiltri algse v\u00e4\u00e4rtuse.<\/p>\n<h1>Freddy vs. Jsonb<\/h1>\n<p>\nTegelikult on booli v\u00e4ljendid ja kuup\u00e4evad juba piisavalt kiirendanud meie p\u00e4ringut, kuid alles j\u00e4i \u00fcks andmet\u00fc\u00fcp. Ausalt \u00f6eldes pole v\u00f5itlus selle filtrimisega siiani l\u00f5ppenud, kuigi siin on ka edusamme. Nii et n\u00e4ete, kuidas \u00f5nnestus meil edastada filter <b>jsonb<\/b> v\u00e4lja eemalolevale serverile.<\/p>\n<pre><code class=\"sql\">selgita anal\u00fc\u00fcsige p\u00f5hjalikult\nSELECT count(1)\nFROM fdw_schema.table \nWHERE is_active is True\nAND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 months' \nAND CURRENT_DATE - INTERVAL '6 months'\nAND meta @&gt; '{\"source\":\"test\"}'::jsonb;\n\nKumulatiivne (kulu=245463.60..245463.61 read=1 laius=8) (reaalne aeg=6727.589..6727.590 read=1 ts\u00fcklis=1)\n  V\u00e4ljund: count(1)\n  -&gt;  V\u00e4lismaine skannimine fdw_schema.\"table\"  (kulu=1100.00..245459.90 read=1478 laius=0) (reaalne aeg=16.213..6634.794 read=1360025 ts\u00fcklis=1)\n        V\u00e4ljund: \"table\".id, \"table\".is_active, \"table\".meta, \"table\".created_dt\n        Filter: ((\"table\".is_active IS TRUE) AND (\"table\".created_dt &gt;= (('now'::cstring)::date - '7 months'::interval)) AND (\"table\".created_dt &lt;= ((('now'::cstring)::date)::timestamp with time zone - '6 months'::interval)))\n        Filtri t\u00f5ttu eemaldatud read: 619961\n        Kaug SQL: SELECT created_dt, is_active FROM fdw_schema.table WHERE ((meta @&gt; '{\"source\": \"test\"}'::jsonb))\nPlaneerimise aeg: 0.747 ms\nT\u00e4ideviimise aeg: 6727.815 ms<\/code><\/pre>\n<p>\nFiltreerimise operaatorite asemel tuleb kasutada olemasolu operaatorit <b>jsonb<\/b> teises. 7 sekundit selle asemel, et algsed 29. Seni on see ainus edukas variant filtrite edastamiseks <b>jsonb<\/b> kaugserverile, kuid siin on oluline arvestada \u00fche piiranguga: kasutame versiooni 9.6, kuid plaanime aprilli l\u00f5puks l\u00f5petada viimased testid ja minna \u00fcle versioonile 12. Kui oleme uuendatud, kirjutame, kuidas see m\u00f5jutas, sest muudatusi, millele on suured lootused, on piisavalt palju: json_path, uus CTE k\u00e4itumine, push down (olemas alates versioonist 10). Sooviksime seda v\u00f5imalikult kiiresti proovida.<\/p>\n<h1>Finish him<\/h1>\n<p>\nOleme kontrollinud, kuidas iga muudatus m\u00f5jutab p\u00e4ringu kiiruselt eraldi. N\u00fc\u00fcd vaatame, mis juhtub, kui k\u00f5ik kolm filtrit on \u00f5igesti kirjutatud.<\/p>\n<pre><code class=\"sql\">selguta anal\u00fc\u00fcs \u00fcksikasjalikult\nSELECT count(1)\nFROM fdw_schema.table \nWHERE is_active = True\nAND created_dt &gt;= (SELECT CURRENT_DATE::timestamptz - INTERVAL '7 month') \nAND created_dt  '{\"source\":\"test\"}'::jsonb;\n\nKogus (kulu=322041.51..322041.52 read=1 laius=8) (reaalne aeg=2278.867..2278.867 read=1 silmus=1)\n  V\u00e4ljund: count(1)\n  InitPlan 1 (tagastab $0)\n    -&gt;  Tulem (kulu=0.00..0.02 read=1 laius=8) (reaalne aeg=0.010..0.010 read=1 silmus=1)\n          V\u00e4ljund: ((('n\u00fc\u00fcd'::cstring)::date)::timestamp with time zone - '7 kuud'::interval)\n  InitPlan 2 (tagastab $1)\n    -&gt;  Tulem (kulu=0.00..0.02 read=1 laius=8) (reaalne aeg=0.003..0.003 read=1 silmus=1)\n          V\u00e4ljund: ((('n\u00fc\u00fcd'::cstring)::date)::timestamp with time zone - '6 kuud'::interval)\n  -&gt;  V\u00e4line skaneerimine fdw_schema.\"table\"  (kulu=100.02..322041.41 read=25 laius=0) (reaalne aeg=8.597..2153.809 read=1360025 silmus=1)\n        V\u00e4ljund: \"table\".id, \"table\".is_active, \"table\".meta, \"table\".created_dt\n        Kaug SQL: SELECT NULL FROM fdw_schema.table WHERE (is_active) AND ((created_dt &gt;= $1::timestamp with time zone)) AND ((created_dt  '{\"source\": \"test\"}'::jsonb))\nPlaneerimise aeg: 0.820 ms\nT\u00e4itmise aeg: 2279.087 ms<\/code><\/pre>\n<p>\nJah, p\u00e4ring n\u00e4eb keerulisem v\u00e4lja, see on sunnitud hind, kuid t\u00e4itmise kiirus on 2 sekundit, mis on rohkem kui 10 korda kiirem! Ja me r\u00e4\u00e4gime siin lihtsast p\u00e4ringust suhteliselt v\u00e4ikese andmestiku kohta. Reaalsetes p\u00e4ringutes oleme saavutanud kasvu kuni mitme sadu kordi.<\/p>\n<p>Kokkuv\u00f5tteks: kui kasutate PostgreSQL-i koos FDW-ga, kontrollige alati, kas k\u00f5ik filtrid saadetakse kaugserverisse, ja see toob teile \u00f5nne\u2026 v\u00e4hemalt kuni olete j\u00f5udnud erinevate tabelite vaheliste join\u2019ideni. <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/et\/server\/\"   title=\"serverite\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1482\">serverite<\/a>. Kuid see on juba lugu veel \u00fche artikli jaoks.<\/p>\n<p>Ait\u00e4h t\u00e4helepanu eest! Ootan k\u00fcsimusi, kommentaare ja lugusid teie kogemustest kommentaarides.<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/498018\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435, \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043f\u043b\u044e\u0441\u044b \u0438 \u0441\u0432\u043e\u0438 \u043c\u0438\u043d\u0443\u0441\u044b. \u041e\u0434\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441 \u043d\u0435\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435, \u0434\u0440\u0443\u0433\u0438\u0435 \u2014 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0418 \u0432 \u0443\u0433\u043e\u0434\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u043b\u0443\u0447\u0448\u0435\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0436\u0435\u0440\u0442\u0432\u044b. \u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u2014 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0415\u0441\u043b\u0438 \u0432 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0435 \u0432\u0441\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u043a SQL \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043a \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0435, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79468,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79467","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435, \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043f\u043b\u044e\u0441\u044b \u0438 \u0441\u0432\u043e\u0438 \u043c\u0438\u043d\u0443\u0441\u044b. \u041e\u0434\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441 \u043d\u0435\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435, \u0434\u0440\u0443\u0433\u0438\u0435 \u2014 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0418 \u0432 \u0443\u0433\u043e\u0434\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u043b\u0443\u0447\u0448\u0435\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0436\u0435\u0440\u0442\u0432\u044b. \u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u2014 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0415\u0441\u043b\u0438 \u0432 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0435 \u0432\u0441\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u043a SQL \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043a \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0435,\" \/>\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\/et\/blog\/administrirovanie\/operativnaya-analitika-v-mikroservisnoj-arhitekture-p%cc%b6o%cc%b6n%cc%b6ya%cc%b6t%cc%b6%cc%b6-%cc%b6i%cc%b6-%cc%b6p%cc%b6r%cc%b6o%cc%b6s%cc%b6t%cc%b6i%cc%b6t%cc%b6%cc%b6-pomoch-i-podskazat-postgres\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435: \u043f\u0336\u043e\u0336\u043d\u0336\u044f\u0336\u0442\u0336\u044c\u0336 \u0336\u0438\u0336 \u0336\u043f\u0336\u0440\u0336\u043e\u0336\u0441\u0336\u0442\u0336\u0438\u0336\u0442\u0336\u044c\u0336 \u043f\u043e\u043c\u043e\u0447\u044c \u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c Postgres FDW | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435, \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043f\u043b\u044e\u0441\u044b \u0438 \u0441\u0432\u043e\u0438 \u043c\u0438\u043d\u0443\u0441\u044b. \u041e\u0434\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441 \u043d\u0435\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435, \u0434\u0440\u0443\u0433\u0438\u0435 \u2014 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0418 \u0432 \u0443\u0433\u043e\u0434\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u043b\u0443\u0447\u0448\u0435\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0436\u0435\u0440\u0442\u0432\u044b. \u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u2014 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0415\u0441\u043b\u0438 \u0432 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0435 \u0432\u0441\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u043a SQL \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043a \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0435,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/operativnaya-analitika-v-mikroservisnoj-arhitekture-p%cc%b6o%cc%b6n%cc%b6ya%cc%b6t%cc%b6%cc%b6-%cc%b6i%cc%b6-%cc%b6p%cc%b6r%cc%b6o%cc%b6s%cc%b6t%cc%b6i%cc%b6t%cc%b6%cc%b6-pomoch-i-podskazat-postgres\" \/>\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=\"2020-04-27T05:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-27T05:42:23+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\udd47Arealine anal\u00fc\u00fcs mikroteenuste arhitektuuris: aidata ja suunata Postgres FDW | ProHoster","description":"Mikroteenuse arhitektuur, nagu k\u00f5ik siin maailmas, omab oma eeliseid ja puudusi. M\u00f5ned protsessid muutuvad selle abil lihtsamaks, teised \u2014 keerulisemaks. Muutuste kiirus ja parem skaleeritavus n\u00f5uavad kompromisse. \u00dcks neist on anal\u00fc\u00fcsi keerukuse suurenemine. Kui monoliidis saab kogu operatiivse anal\u00fc\u00fcsi kokku viia SQL p\u00e4ringuteks anal\u00fc\u00fctilisse replikaadi,","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/operativnaya-analitika-v-mikroservisnoj-arhitekture-p%cc%b6o%cc%b6n%cc%b6ya%cc%b6t%cc%b6%cc%b6-%cc%b6i%cc%b6-%cc%b6p%cc%b6r%cc%b6o%cc%b6s%cc%b6t%cc%b6i%cc%b6t%cc%b6%cc%b6-pomoch-i-podskazat-postgres","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435: \u043f\u0336\u043e\u0336\u043d\u0336\u044f\u0336\u0442\u0336\u044c\u0336 \u0336\u0438\u0336 \u0336\u043f\u0336\u0440\u0336\u043e\u0336\u0441\u0336\u0442\u0336\u0438\u0336\u0442\u0336\u044c\u0336 \u043f\u043e\u043c\u043e\u0447\u044c \u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c Postgres FDW | ProHoster","og:description":"\u041c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435, \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043f\u043b\u044e\u0441\u044b \u0438 \u0441\u0432\u043e\u0438 \u043c\u0438\u043d\u0443\u0441\u044b. \u041e\u0434\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441 \u043d\u0435\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435, \u0434\u0440\u0443\u0433\u0438\u0435 \u2014 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0418 \u0432 \u0443\u0433\u043e\u0434\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u043b\u0443\u0447\u0448\u0435\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0436\u0435\u0440\u0442\u0432\u044b. \u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u2014 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0415\u0441\u043b\u0438 \u0432 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0435 \u0432\u0441\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u043a SQL \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043a \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0435,","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/operativnaya-analitika-v-mikroservisnoj-arhitekture-p%cc%b6o%cc%b6n%cc%b6ya%cc%b6t%cc%b6%cc%b6-%cc%b6i%cc%b6-%cc%b6p%cc%b6r%cc%b6o%cc%b6s%cc%b6t%cc%b6i%cc%b6t%cc%b6%cc%b6-pomoch-i-podskazat-postgres","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":"2020-04-27T05:42:23+00:00","article:modified_time":"2020-04-27T05:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79467","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:37:24","updated":"2026-02-09 21:38:01"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/79467","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=79467"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/79467\/revisions"}],"predecessor-version":[{"id":159871,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/79467\/revisions\/159871"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/79468"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=79467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=79467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=79467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}