{"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\u00fcs mikroteenuste arhitektuuris: \u0336m\u0336e\u0336e\u0336l\u0336e\u0336 \u0336a\u0336i\u0336n\u0336u\u0336l\u0336d\u0336e\u0336 \u0336v\u0336a\u0336t\u0336a\u0336n\u0336e\u0336 \u0336ja\u0336 \u0336k\u0336i\u0336t\u0336t\u0336u\u0336m\u0336i\u0336n\u0336e\u0336 \u0336p\u0336o\u0336m\u0336o\u0336g\u0336a\u0336 \u0336ja\u0336 \u0336n\u0336o\u0336u\u0336n\u0336d\u0336a\u0336 Postgres FDW","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Mikroteenuste arhitektuur, nagu k\u00f5ik selles maailmas, omab oma plusse ja miinuseid. M\u00f5nel juhul lihtsustavad protsessid seda, teistel juhtudel aga keerulisemaks. Muudatuste kiirus ja parem skaleeritavus n\u00f5uavad teatud ohvrid tooma. \u00dcks neist on anal\u00fc\u00fctika keerukus. Kui monoliidis saab kogu operatiivse anal\u00fc\u00fctika v\u00e4hendada SQL-p\u00e4ringuteks anal\u00fc\u00fctilisele koopia jaoks, siis mitmete teenuste arhitektuuris on igal teenusel oma andmebaas ja tundub, et \u00fche p\u00e4ringuga ei piisa (aga v\u00f5ib-olla siiski piisab?). Neile, keda huvitab, kuidas me lahendasime operatiivse anal\u00fc\u00fctika probleemi meie ettev\u00f5ttes ja kuidas me \u00f5ppisime selle lahendusega elama - olete teretulnud.<\/p>\n<p><img decoding=\"async\" alt=\"Operatiivanal\u00fc\u00fcs mikroteenuste arhitektuuris: \u0336m\u0336e\u0336e\u0336l\u0336e\u0336 \u0336a\u0336i\u0336n\u0336u\u0336l\u0336d\u0336e\u0336 \u0336v\u0336a\u0336t\u0336a\u0336n\u0336e\u0336 \u0336ja\u0336 \u0336k\u0336i\u0336t\u0336t\u0336u\u0336m\u0336i\u0336n\u0336e\u0336 \u0336p\u0336o\u0336m\u0336o\u0336g\u0336a\u0336 \u0336ja\u0336 \u0336n\u0336o\u0336u\u0336n\u0336d\u0336a\u0336 Postgres FDW\" src=\"\/wp-content\/uploads\/2020\/04\/4296389f06d488999cc023dcaa3027f7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMinu nimi on Pavel Siva\u0161, t\u00f6\u00f6tan DomKlikis meeskonnas, mis vastutab anal\u00fc\u00fctilise andmehoidla hooldamise eest. Tinglikult saab meie tegevuse klassifitseerida andmeinseneri valdkonda, kuid t\u00f5eliselt on \u00fclesannete spekter palju laiem. Olemas on standardsetele andmeinseneri \u00fclesannetele iseloomulikud ETL\/ELT, andmeanal\u00fc\u00fcsi t\u00f6\u00f6riistade toetamine ja kohandamine ning oma t\u00f6\u00f6riistade arendamine. Eelk\u00f5ige otsustasime jooksva aruandluse jaoks \u201eteeskleda\u201d, 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>Meie oleme kaalunud erinevaid variante. T\u00e4ieliku andmehoidla ehitamine oleks olnud v\u00f5imalik \u2014 me isegi proovisime, kuid ausalt \u00f6eldes ei \u00f5nnestunud meil piisavalt sageli muutuva loogika \u00fchitamine piisavalt aeglase andmehoidla ehitamise ja muutmise protsessiga (kui kellelgi on see \u00f5nnestunud, kirjutage kommentaaridesse, kuidas). Me oleksime v\u00f5inud anal\u00fc\u00fctikutele \u00f6elda: \u201ePoisid, \u00f5ppige pythonit ja kasutage anal\u00fc\u00fctilisi replikaate,\u201d kuid see oleks olnud lisataotlus t\u00f6\u00f6tajate valikule ja tundus, et seda oleks parem v\u00e4ltida, kui v\u00f5imalik. Otsustasime proovida kasutada FDW (Foreign Data Wrapper) tehnoloogiat: tegelikult on see standardne dblink, mis on SQL standardis, kuid oma palju mugavama liidese kaudu. Selle p\u00f5hjal l\u00f5ime lahenduse, mis l\u00f5puks ka kinnistus ja millele me j\u00e4\u00e4me. Selle \u00fcksikasjad on eraldi artikli teema, v\u00f5ib-olla isegi mitte \u00fche, kuna tahaks r\u00e4\u00e4kida paljust: alates andmebaaside skeemide s\u00fcnkroniseerimisest kuni juurdep\u00e4\u00e4su haldamise ja isikuandmete anon\u00fc\u00fcmimiseni. Peame samuti m\u00e4rkima, et see lahendus ei asenda tegelikke anal\u00fc\u00fctilisi andmebaase ja hoidlasi, vaid lahendab vaid konkreetse \u00fclesande.<\/p>\n<p>\u00dcldiselt n\u00e4eb see v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"Operatiivanal\u00fc\u00fcs mikroteenuste arhitektuuris: \u0336m\u0336e\u0336e\u0336l\u0336e\u0336 \u0336a\u0336i\u0336n\u0336u\u0336l\u0336d\u0336e\u0336 \u0336v\u0336a\u0336t\u0336a\u0336n\u0336e\u0336 \u0336ja\u0336 \u0336k\u0336i\u0336t\u0336t\u0336u\u0336m\u0336i\u0336n\u0336e\u0336 \u0336p\u0336o\u0336m\u0336o\u0336g\u0336a\u0336 \u0336ja\u0336 \u0336n\u0336o\u0336u\u0336n\u0336d\u0336a\u0336 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 k\u00f5ige olulisem on see, et sellele andmebaasile on FDW kaudu \u00fchendatud k\u00f5igi teenuste anal\u00fc\u00fctilised replikad. See v\u00f5imaldab esitada p\u00e4ringu mitmele andmebaasile, olgu need siis PostgreSQL, MySQL, MongoDB v\u00f5i miski muu (fail, API, kui sobivat wrapperit ei ole, v\u00f5ib kirjutada oma). Noh, k\u00f5lab h\u00e4sti, eks? L\u00f5petame siin?<\/p>\n<p>Kui k\u00f5ik l\u00f5ppeks nii kiiresti ja lihtsalt, siis ilmselt ei oleks ka artiklit.<\/p>\n<p>On oluline selgelt m\u00f5ista, kuidas PostgreSQL t\u00f6\u00f6tleb p\u00e4ringuid kaugserveritele. 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\u00f5plikud arvutused teeb juba ise, seega s\u00f5ltub p\u00e4ringu t\u00e4itmise kiirus oluliselt sellest, kuidas see on kirjutatud. Tuleb samuti m\u00e4rkida: kui andmed saabuvad kaugserverist, siis neil pole enam indekseid, pole midagi, mis aitaks planeerijal, seega saame me ise vaid aidata ja juhendada teda. Ja just sellest tahakski rohkem r\u00e4\u00e4kida.<\/p>\n<h1>Lihtne p\u00e4ring ja plaan selle jaoks<\/h1>\n<p>\nEt n\u00e4idata, kuidas PostgreSQL t\u00e4idab p\u00e4ringu 6 miljoni rea tabelile kaugserveris, <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/server\/dts-dronten\/\"   title=\"serveris\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2589\">serveris<\/a>, vaatame lihtsat plaani.<\/p>\n<pre><code class=\"sql\">selgitada anal\u00fc\u00fcsi \u00fcksikasjalikult  \nSELECT count(1)\nFROM fdw_schema.table;\n\nKogumine  (kulud=418383.23..418383.24 ridade arv=1 laius=8) (reaalne aeg=3857.198..3857.198 ridade arv=1 ts\u00fcklites=1)\n  V\u00e4ljund: count(1)\n  -&gt;  V\u00e4lisv\u00f5rgustiku skaneerimine fdw_schema.&quot;table&quot;  (kulud=100.00..402376.14 ridade arv=6402838 laius=0) (reaalne aeg=4.874..3256.511 ridade arv=6406868 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        Kaug SQL: SELECT NULL FROM fdw_schema.table\nPlaneerimise aeg: 0.986 ms\nT\u00e4ideviimise aeg: 3857.436 ms<\/code><\/pre>\n<p>\nVERBOSE-k\u00e4sk kasutamine v\u00f5imaldab n\u00e4ha p\u00e4ringut, mis saadetakse kaugserverisse, ja tulemusi, mida saame edasiseks t\u00f6\u00f6tlemiseks (rida RemoteSQL).<\/p>\n<p>Liigume natuke edasi ja lisame meie p\u00e4ringule m\u00f5ned filterd: \u00fcks j\u00e4rgi <b>boolean<\/b> v\u00e4lja, \u00fcks sisendi j\u00e4rgi <b>timestamp<\/b> ajavahemikus ja \u00fcks j\u00e4rgi <b>jsonb<\/b>.<\/p>\n<pre><code class=\"sql\">selgitada anal\u00fc\u00fcsi \u00fcksikasjalikult\nSELECT count(1)\nFROM fdw_schema.table \nWHERE is_active is True\nAND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' \nAND CURRENT_DATE - INTERVAL '6 month'\nAND meta-&gt;&gt;'source' = 'test';\n\nKogumine  (kulud=577487.69..577487.70 ridade arv=1 laius=8) (reaalne aeg=27473.818..25473.819 ridade arv=1 ts\u00fcklites=1)\n  V\u00e4ljund: count(1)\n  -&gt;  V\u00e4lisv\u00f5rgustiku skaneerimine fdw_schema.&quot;table&quot;  (kulud=100.00..577469.21 ridade arv=7390 laius=0) (reaalne aeg=31.369..25372.466 ridade arv=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 IS TRUE) AND ((&quot;table&quot;.meta -&gt;&gt; 'source'::text) = 'test'::text) AND (&quot;table&quot;.created_dt &gt;= (('now'::cstring)::date - '7 mons'::interval)) AND (&quot;table&quot;.created_dt &lt;= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))\n        Filtrist eemaldatud read: 5046843\n        Kaug SQL: SELECT 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 oluline punkt, millele tuleks t\u00e4helepanu p\u00f6\u00f6rata p\u00e4ringute kirjutamisel. Filterid ei edastunud kaugserverisse, mis t\u00e4hendab, et PostgreSQL t\u00f5mbab k\u00f5ik 6 miljonit rida, et seej\u00e4rel kohalikul tasandil filtreerida (rida Filter) ja teostada agregatsiooni. Edu v\u00f5ti on kirjutada p\u00e4ring nii, et filterid edastatakse kaugmasinale ja saame ja agreggeerida ainult vajalikud read. <\/p>\n<h1>See on vale v\u00e4ide<\/h1>\n<p>\nBoolean v\u00e4ljadega \u2014 k\u00f5ik on lihtne. Algse p\u00e4ringu probleem tekkis operaatori t\u00f5ttu <b>is<\/b>. Kui asendada see <b>=<\/b>, saame j\u00e4rgmise tulemuse:<\/p>\n<pre><code class=\"sql\">selgitada anal\u00fc\u00fcsi \u00fcksikasjalikult\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\nKogumine  (kulud=508010.14..508010.15 ridade arv=1 laius=8) (reaalne aeg=19064.314..19064.314 ridade arv=1 ts\u00fcklites=1)\n  V\u00e4ljund: count(1)\n  -&gt;  V\u00e4lisv\u00f5rgustiku skaneerimine fdw_schema.&quot;table&quot;  (kulud=100.00..507988.44 ridade arv=8679 laius=0) (reaalne aeg=33.035..18951.278 ridade arv=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;.meta -&gt;&gt; 'source'::text) = 'test'::text) AND (&quot;table&quot;.created_dt &gt;= (('now'::cstring)::date - '7 mons'::interval)) AND (&quot;table&quot;.created_dt &lt;= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))\n        Filtrist eemaldatud read: 3567989\n        Kaug SQL: SELECT created_dt, meta FROM fdw_schema.table WHERE (is_active)\nPlaneerimise aeg: 0.834 ms\nT\u00e4ideviimise aeg: 19064.534 ms<\/code><\/pre>\n<p>\nNagu n\u00e4ete, viidi filter kaugarvutisse ja t\u00e4itmise aeg v\u00e4henes 27 sekundilt 19 sekundile. <\/p>\n<p>On oluline m\u00e4rkida, et operaator <b>is<\/b> erineb operaatorist <b>=<\/b> sellega, et see oskab t\u00f6\u00f6tada Null v\u00e4\u00e4rtusega. See t\u00e4hendab, et <b>is not True<\/b> filtris j\u00e4tab v\u00e4\u00e4rtused False ja Null, samas kui <b>!= True<\/b> j\u00e4tab alles ainult v\u00e4\u00e4rtused False. Seet\u00f5ttu, kui vahetate operaatorit <b>is not<\/b> tuleb filtri jaoks edastada kaks tingimust operaatoriga OR, n\u00e4iteks: <b>WHERE (col != True) OR (col is null)<\/b>.<\/p>\n<p>Booleani oleme selgeks teinud, liigume edasi. Ja enne kui l\u00e4heme edasi, taastame filter booleseks v\u00e4\u00e4rtuseks algsesse seisundisse, et eraldi uurida teiste muudatuste m\u00f5ju.<\/p>\n<h1>timestamptz? hz<\/h1>\n<p>\nTavaliselt tuleb katsetada, kuidas \u00f5igesti kirjutada p\u00e4ring, mis h\u00f5lmab eemalolevaid servereid, ja alles seej\u00e4rel otsida seletusi, miks asi just nii toimub. Internetis on selle kohta v\u00e4ga v\u00e4he teavet. N\u00e4iteks on katsetes selgunud, et fikseeritud kuup\u00e4eva filter j\u00f5uab eemalolevale serverile kiiresti, kuid kui proovime m\u00e4\u00e4rata kuup\u00e4eva d\u00fcnaamiliselt, n\u00e4iteks now() v\u00f5i CURRENT_DATE, siis see ei juhtu. Meie n\u00e4ites lisasime sellise filtri, et veerg created_at sisaldab andmeid t\u00e4pselt 1 kuu tagasi (BETWEEN CURRENT_DATE - INTERVAL '7 month' AND CURRENT_DATE - INTERVAL '6 month'). Mida me siis selle olukorra puhul ette v\u00f5tsime?<\/p>\n<pre><code class=\"sql\">selgitage anal\u00fc\u00fcs \u00fcksikasjalikult\nSELECT count(1)\nFROM fdw_schema.table \nWHERE is_active is True\nAND created_dt &gt;= (SELECT CURRENT_DATE::timestamptz - INTERVAL '7 kuud') \nAND created_dt &gt;'source' = 'test';\n\nKogus (kulu=306875.17..306875.18 ridade arv=1 laius=8) (reaalne aeg=4789.114..4789.115 ridade arv=1 ts\u00fcklites=1)\n  V\u00e4ljund: count(1)\n  InitPlan 1 (tagastab $0)\n    -&gt; Tulemuseks (kulu=0.00..0.02 ridade arv=1 laius=8) (reaalne aeg=0.007..0.008 ridade arv=1 ts\u00fcklites=1)\n          V\u00e4ljund: ((('now'::cstring)::date)::timestamp with time zone - '7 kuud'::interval)\n  InitPlan 2 (tagastab $1)\n    -&gt; Tulemuseks (kulu=0.00..0.02 ridade arv=1 laius=8) (reaalne aeg=0.002..0.002 ridade arv=1 ts\u00fcklites=1)\n          V\u00e4ljund: ((('now'::cstring)::date)::timestamp with time zone - '6 kuud'::interval)\n  -&gt; V\u00f5\u00f5rskane fdw_schema.\"table\" (kulu=100.02..306874.86 ridade arv=105 laius=0) (reaalne aeg=23.475..4681.419 ridade arv=1360025 ts\u00fcklites=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        Ridad eemaldatud filtri t\u00f5ttu: 76934\n        Kaug-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 palusime planeerijal eelnevalt arvutada kuup\u00e4eva allk\u00fcsimuses ja edastada juba valmisse viidatud muutuja filtrisse. Ja see soovitus andis meile suurep\u00e4rase tulemuse, p\u00e4ring kiirus kasvas peaaegu 6 korda!<\/p>\n<p>Taaskord on siin oluline olla t\u00e4helepanelik: allk\u00fcsimuse andmet\u00fc\u00fcp peab olema sama, mis filtritav v\u00e4ljal, vastasel juhul otsustab planeerija, et kuna t\u00fc\u00fcbid on erinevad, tuleb k\u00f5igepealt hankida k\u00f5ik andmed ja alles seej\u00e4rel need kohaliku filtri j\u00e4rgi sorteerida.<\/p>\n<p>Tagastame kuup\u00e4eva filtri algse v\u00e4\u00e4rtuse.<\/p>\n<h1>Freddy vs. Jsonb<\/h1>\n<p>\nKokkuv\u00f5ttes on boolean v\u00e4ljad ja kuup\u00e4evad juba piisavalt kiirendanud meie p\u00e4ringut, kuid \u00fcks andmet\u00fc\u00fcpidest j\u00e4i veel alles. Ausalt \u00f6eldes pole meil vaatamata edusammudele filtri osas edasiminek l\u00f5petatud. Nii et siin on, kuidas me suutsime filtri edastada <b>jsonb<\/b> v\u00e4lja kaugserverisse.<\/p>\n<pre><code class=\"sql\">selgitage anal\u00fc\u00fcsi \u00fcksikasjalikult\nSELECT count(1)\nFROM fdw_schema.table \nWHERE is_active is True\nAND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 kuud' \nAND CURRENT_DATE - INTERVAL '6 kuud'\nAND meta @&gt; '{\"source\":\"test\"}'::jsonb;\n\nKogus (kulu=245463.60..245463.61 ridade arv=1 laius=8) (reaalne aeg=6727.589..6727.590 ridade arv=1 ts\u00fcklites=1)\n  V\u00e4ljund: count(1)\n  -&gt; V\u00f5\u00f5rskane fdw_schema.\"table\" (kulu=1100.00..245459.90 ridade arv=1478 laius=0) (reaalne aeg=16.213..6634.794 ridade arv=1360025 ts\u00fcklites=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 kuud'::interval)) AND (\"table\".created_dt  '{\"source\": \"test\"}'::jsonb))\nPlaneerimise aeg: 0.747 ms\nT\u00e4ideviimise aeg: 6727.815 ms<\/code><\/pre>\n<p>\nFiltreerimise operaatorite asemel tuleb kasutada \u00fchte sisaldumise operaatorit <b>jsonb<\/b> teises. 7 sekundit asemel algset 29. Praegu on see ainus edukas meetod filtrite edastamiseks <b>jsonb<\/b> kaugserverisse, kuid siin on oluline arvestada \u00fchte piirangut: me kasutame andmebaasi versiooni 9.6, kuid plaanime aprilli l\u00f5puks l\u00f5petada viimased testid ja \u00fcle minna versioonile 12. Kui me uuendame, kirjutame, kuidas see m\u00f5jutas, sest muutusi, millele loodetakse, on palju: json_path, uued CTE k\u00e4itumised, push down (mis on olemas alates versioonist 10). Tahaksime seda v\u00f5imalikult kiiresti proovida.<\/p>\n<h1>L\u00f5peta ta<\/h1>\n<p>\nOleme kontrollinud, kuidas iga muudatus m\u00f5jutab p\u00e4ringu kiiruset eraldi. Vaatame n\u00fc\u00fcd, mis juhtub, kui k\u00f5ik kolm filtrit on \u00f5igesti kirjutatud.<\/p>\n<pre><code class=\"sql\">selgitse anal\u00fc\u00fcs p\u00f5hjalik\nSELECT count(1)\nFROM fdw_schema.table \nWHERE is_active = true\nAND created_dt &gt;= (SELECT CURRENT_DATE::timestamptz - INTERVAL '7 kuud') \nAND created_dt  '{\"source\":\"test\"}'::jsonb;\n\nKogumine  (kulud=322041.51..322041.52 read=1 width=8) (reaalne aeg=2278.867..2278.867 read=1 ts\u00fcklid=1)\n  V\u00e4ljund: count(1)\n  Algplaan 1 (tagastab $0)\n    -&gt;  Tulem  (kulud=0.00..0.02 read=1 width=8) (reaalne aeg=0.010..0.010 read=1 ts\u00fcklid=1)\n          V\u00e4ljund: ((('now'::cstring)::date)::timestamp with time zone - '7 kuud'::interval)\n  Algplaan 2 (tagastab $1)\n    -&gt;  Tulem  (kulud=0.00..0.02 read=1 width=8) (reaalne aeg=0.003..0.003 read=1 ts\u00fcklid=1)\n          V\u00e4ljund: ((('now'::cstring)::date)::timestamp with time zone - '6 kuud'::interval)\n  -&gt;  Ameerika Skaneerimine fdw_schema.&quot;table&quot;  (kulud=100.02..322041.41 read=25 width=0) (reaalne aeg=8.597..2153.809 read=1360025 ts\u00fcklid=1)\n        V\u00e4ljund: &quot;table&quot;.id, &quot;table&quot;.is_active, &quot;table&quot;.meta, &quot;table&quot;.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\u00e4ideviimise 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 \u00fcle 10 korra kiirem! Ja me r\u00e4\u00e4gime lihtsast p\u00e4ringust suhteliselt v\u00e4ikeses andmekogus. Reaalsetes p\u00e4ringutes oleme n\u00e4inud kasvu kuni mitme sadadeni.<\/p>\n<p>Teeme kokkuv\u00f5tte: kui kasutate PostgreSQL-i koos FDW-ga, kontrollige alati, kas k\u00f5ik filtrid saadetakse kaugserverisse, ja teil on \u00f5nne... v\u00e4hemalt kuni j\u00f5uate erinevate tabelite vaheliste JOIN-ide juurde. <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/server\/\"   title=\"serverid\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1482\">serverid<\/a>. Kuid see on juba lugu veel \u00fche artikli jaoks.<\/p>\n<p>Ait\u00e4h t\u00e4helepanu eest! Oleksin t\u00e4nulik k\u00fcsimuste, kommentaaride ja ka teie kogemuste lugude eest 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 5.0.1.1 - 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.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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\udd47Ajaline anal\u00fc\u00fctika mikroteenuste arhitektuuris: Postgres FDW | ProHoster aitamine ja n\u00f5ustamine","description":"Mikroteenuste arhitektuuril, nagu k\u00f5igil asjadel, on omad plussid ja miinused. M\u00f5ned protsessid muutuvad selle abil lihtsamaks, teised aga keerulisemaks.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}