{"id":35259,"date":"2019-10-31T22:03:17","date_gmt":"2019-10-31T19:03:17","guid":{"rendered":"https:\/\/prohoster.info\/blog\/istoriya-odnogo-sql-rassledovaniya\/"},"modified":"2019-10-31T22:03:17","modified_gmt":"2019-10-31T19:03:17","slug":"istoriya-odnogo-sql-rassledovaniya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/istoriya-odnogo-sql-rassledovaniya","title":{"rendered":"Egy SQL nyomoz\u00e1s t\u00f6rt\u00e9nete","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tavaly decemberben \u00e9rdekes hiba-jelent\u00e9st kaptam a VWO t\u00e1mogat\u00f3i csapat\u00e1t\u00f3l. Egy nagyv\u00e1llalati \u00fcgyf\u00e9l analitikai jelent\u00e9s\u00e9nek bet\u00f6lt\u00e9si ideje elk\u00e9peszt\u0151en hossz\u00fa volt. Mivel ez a ter\u00fclet a felel\u0151ss\u00e9gem volt, azonnal a probl\u00e9ma megold\u00e1s\u00e1ra \u00f6sszpontos\u00edtottam.<\/p>\n<p><\/p>\n<h2>H\u00e1tt\u00e9r<\/h2>\n<p><\/p>\n<p>Hogy vil\u00e1gos legyen, mir\u0151l van sz\u00f3, egy kicsit mes\u00e9lek a VWO-r\u00f3l. Ez egy platform, amely lehet\u0151v\u00e9 teszi, hogy k\u00fcl\u00f6nb\u00f6z\u0151 c\u00e9lzott kamp\u00e1nyokat ind\u00edtsunk a weboldalainkon: A\/B teszteket v\u00e9gezz\u00fcnk, nyomon k\u00f6vess\u00fck a l\u00e1togat\u00f3kat \u00e9s a konverzi\u00f3kat, elemezz\u00fck az \u00e9rt\u00e9kes\u00edt\u00e9si t\u00f6lcs\u00e9rt, h\u0151t\u00e9rk\u00e9peket jelen\u00edts\u00fcnk meg, \u00e9s l\u00e1togat\u00e1sok felv\u00e9teleit j\u00e1tszhassuk le.<\/p>\n<p><\/p>\n<p>De a platform legfontosabb funkci\u00f3ja a jelent\u00e9sek k\u00e9sz\u00edt\u00e9se. Az \u00f6sszes fent eml\u00edtett funkci\u00f3 \u00f6sszefon\u00f3dik egym\u00e1ssal. A nagyv\u00e1llalati \u00fcgyfelek sz\u00e1m\u00e1ra nagy mennyis\u00e9g\u0171 inform\u00e1ci\u00f3 haszontalan lenne egy er\u0151teljes platform n\u00e9lk\u00fcl, amely ezt analitikai szempontb\u00f3l \u00e1br\u00e1zolja.<\/p>\n<p><\/p>\n<p>A platform haszn\u00e1lat\u00e1val tetsz\u0151leges lek\u00e9rdez\u00e9st v\u00e9gezhet\u00fcnk egy nagy adathalmazon. \u00cdme egy egyszer\u0171 p\u00e9lda:<\/p>\n<p><\/p>\n<pre>Mutass minden kattint\u00e1st az \"abc.com\" oldalon\nSZEPTEMBER 1-t\u0151l\nSZEPTEMBER 30-ig\nazok sz\u00e1m\u00e1ra, akik\nChrome-ot haszn\u00e1ltak VAGY\n(Eur\u00f3p\u00e1ban tart\u00f3zkodtak \u00c9S iPhone-t haszn\u00e1ltak)<\/pre>\n<p><\/p>\n<p>Figyeljen a logikai oper\u00e1torokra. Ezek el\u00e9rhet\u0151ek az \u00fcgyfelek sz\u00e1m\u00e1ra a lek\u00e9rdez\u0151 fel\u00fcleten, hogy tetsz\u0151leges bonyolults\u00e1g\u00fa lek\u00e9rdez\u00e9seket v\u00e9gezzenek a mint\u00e1k megszerz\u00e9s\u00e9re.<\/p>\n<p><\/p>\n<h2>\u00cdme az optimiz\u00e1lt v\u00e1ltozata ennek a lek\u00e9rdez\u00e9snek.<\/h2>\n<p><\/p>\n<p>Az eml\u00edtett \u00fcgyf\u00e9l megpr\u00f3b\u00e1lt valamit tenni, ami intuit\u00edv m\u00f3don gyorsan m\u0171k\u00f6dnie kellene:<\/p>\n<p><\/p>\n<pre>Mutasd meg az \u00f6sszes \u00fcl\u00e9st, ahol a felhaszn\u00e1l\u00f3k b\u00e1rmely oldalra l\u00e1togattak, amelynek URL-j\u00e9ben szerepel a \"jobs\" kifejez\u00e9s<\/pre>\n<p><\/p>\n<p>Az oldalon hatalmas forgalom volt, \u00e9s t\u00f6bb mint egymilli\u00f3 egyedi URL-c\u00edmet t\u00e1roltunk csup\u00e1n ennek \u00e9rdek\u00e9ben. \u0150k pedig egy viszonylag egyszer\u0171 mint\u00e1zatot akartak tal\u00e1lni, amely a \u00fczleti modellj\u00fckh\u00f6z kapcsol\u00f3dik.<\/p>\n<p>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>El\u0151zetes vizsg\u00e1lat<\/h2>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg, mi t\u00f6rt\u00e9nik az adatb\u00e1zisban. Al\u00e1bb l\u00e1that\u00f3 az alapvet\u0151en lass\u00fa SQL lek\u00e9rdez\u00e9s:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">SELECT \n    count(*) \nFROM \n    acc_{account_id}.urls as recordings_urls, \n    acc_{account_id}.recording_data as recording_data, \n    acc_{account_id}.sessions as sessions \nWHERE \n    recording_data.usp_id = sessions.usp_id \n    AND sessions.referrer_id = recordings_urls.id \n    AND  (  urls &amp;&amp; array(select id from acc_{account_id}.urls where url ILIKE '%enterprise_customer.com\/jobs%')::text[] ) \n    AND r_time &gt; to_timestamp(1542585600) \n    AND r_time = 5 \n    AND recording_data.num_of_pages &gt; 0;<\/code><\/pre>\n<p><\/p>\n<p>\u00cdme az id\u0151z\u00edt\u00e9sek:<\/p>\n<p><\/p>\n<pre>Tervezett id\u0151: 1.480 ms\nFuttat\u00e1si id\u0151: 1431924.650 ms<\/pre>\n<p><\/p>\n<p>A lek\u00e9rdez\u00e9s 150 ezer sort \u00e9rintett. A lek\u00e9rdez\u00e9s \u00fctemez\u0151je n\u00e9h\u00e1ny \u00e9rdekes r\u00e9szletet mutatott, de nyilv\u00e1nval\u00f3 sz\u0171k keresztmetszeteket nem tal\u00e1ltunk.<\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg tov\u00e1bb a lek\u00e9rdez\u00e9st. Mint l\u00e1that\u00f3, ezt v\u00e9gzi. <code>JOIN<\/code> h\u00e1rom t\u00e1bl\u00e1zatot:<\/p>\n<p><\/p>\n<ol>\n<li><strong>sessions<\/strong>: a munkamenet-inform\u00e1ci\u00f3k megjelen\u00edt\u00e9s\u00e9hez: b\u00f6ng\u00e9sz\u0151, felhaszn\u00e1l\u00f3i \u00fcgyn\u00f6k, orsz\u00e1g stb.<\/li>\n<li><strong>recording_data<\/strong>: r\u00f6gz\u00edtett URL-ek, oldalak, l\u00e1togat\u00e1si id\u0151tartamok.<\/li>\n<li><strong>urls<\/strong>: a rendk\u00edv\u00fcl hossz\u00fa URL-ek megdupl\u00e1z\u00f3d\u00e1s\u00e1nak elker\u00fcl\u00e9se \u00e9rdek\u00e9ben k\u00fcl\u00f6n t\u00e1bl\u00e1zatban t\u00e1roljuk \u0151ket.<\/li>\n<\/ol>\n<p><\/p>\n<p>Vegye \u00e9szre azt is, hogy minden t\u00e1bl\u00e1zatunk m\u00e1r el van v\u00e1lasztva <code>account_id<\/code>. \u00cdgy elker\u00fclhetj\u00fck, hogy egy k\u00fcl\u00f6n\u00f6sen nagy fi\u00f3kb\u00f3l ad\u00f3d\u00f3 probl\u00e9m\u00e1k a t\u00f6bbieket is \u00e9rints\u00e9k.<\/p>\n<p><\/p>\n<h2>Nyomoz\u00e1s nyomok ut\u00e1n<\/h2>\n<p><\/p>\n<p>K\u00f6zelebbr\u0151l megvizsg\u00e1lva l\u00e1tjuk, hogy valami nem stimmel a konkr\u00e9t lek\u00e9rdez\u00e9ssel. \u00c9rdemes k\u00f6zelebbr\u0151l megn\u00e9zni ezt a sort:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">urls &amp;&amp; array(\n\tselect id from acc_{account_id}.urls \n\twhere url  ILIKE  '%enterprise_customer.com\/jobs%'\n)::text[]<\/code><\/pre>\n<p><\/p>\n<p>Az els\u0151 gondolatom az volt, hogy tal\u00e1n az ILIKE miatt van. <code>ILIKE<\/code> ezeken a hossz\u00fa URL-eken (t\u00f6bb mint 1,4 milli\u00f3 <strong>egyedi\u00a0<\/strong>URL-c\u00edmet gy\u0171jt\u00f6tt\u00fcnk \u00f6ssze ehhez a fi\u00f3khoz), a teljes\u00edtm\u00e9ny cs\u00f6kkenhet.<\/p>\n<p><\/p>\n<p>De nem \u2014 nem err\u0151l van sz\u00f3!<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">SELECT id FROM urls WHERE url ILIKE '%enterprise_customer.com\/jobs%';\n  id\n--------\n ...\n(198661 sor)\n\nId\u0151: 5231.765 ms<\/code><\/pre>\n<p><\/p>\n<p>Maga a mintakeres\u00e9s mind\u00f6ssze 5 m\u00e1sodpercet vesz ig\u00e9nybe. A mintakeres\u00e9s egy milli\u00f3 egyedi URL-en nyilv\u00e1nval\u00f3an nem jelent probl\u00e9m\u00e1t.<\/p>\n<p><\/p>\n<p>A k\u00f6vetkez\u0151 gyan\u00fas\u00edtott a list\u00e1n \u2014 t\u00f6bb. <code>JOIN<\/code>Lehet, hogy a t\u00falzott haszn\u00e1latuk lass\u00edtotta le a rendszert? \u00c1ltal\u00e1ban <code>JOIN<\/code>\u2018A mem\u00f3ria \u2014 a legszembet\u0171n\u0151bb jel\u00f6lt a teljes\u00edtm\u00e9nyprobl\u00e9m\u00e1kra, de nem hittem, hogy a mi eset\u00fcnk tipikus.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">analytics_db=# SELECT\n    count(*)\nFROM\n    acc_{account_id}.urls as recordings_urls,\n    acc_{account_id}.recording_data_0 as recording_data,\n    acc_{account_id}.sessions_0 as sessions\nWHERE\n    recording_data.usp_id = sessions.usp_id\n    AND sessions.referrer_id = recordings_urls.id\n    AND r_time &gt; to_timestamp(1542585600)\n    AND r_time =5\n    AND recording_data.num_of_pages &gt; 0 ;\n count\n-------\n  8086\n(1 sor)\n\nId\u0151: 147.851 ms<\/code><\/pre>\n<p><\/p>\n<p>\u00c9s ez sem a mi eset\u00fcnk volt. <code>JOIN<\/code>\u2018A mem\u00f3ria meglehet\u0151sen gyorsnak bizonyult.<\/p>\n<p><\/p>\n<h2>Sz\u0171k\u00edtj\u00fck a gyan\u00fas\u00edtottak k\u00f6r\u00e9t<\/h2>\n<p><\/p>\n<p>K\u00e9sz voltam m\u00f3dos\u00edtani a lek\u00e9rdez\u00e9st b\u00e1rmilyen lehets\u00e9ges teljes\u00edtm\u00e9nyjavul\u00e1s \u00e9rdek\u00e9ben. A csapatommal k\u00e9t f\u0151 \u00f6tletet dolgoztunk ki:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Haszn\u00e1ljon EXISTS-t az URL allek\u00e9rdez\u00e9shez<\/strong>: Szerett\u00fck volna m\u00e9g egyszer ellen\u0151rizni, hogy van-e probl\u00e9ma az URL-ek allek\u00e9rdez\u00e9s\u00e9vel. Az egyik m\u00f3dja ennek el\u00e9r\u00e9s\u00e9re az, hogy egyszer\u0171en haszn\u00e1lja. <code>V\u00c9GE;<\/code>. <code>V\u00c9GE;<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/functions-subquery.html#FUNCTIONS-SUBQUERY-EXISTS\">k\u00e9pes<\/a><\/noindex> jelent\u0151sen jav\u00edtja a teljes\u00edtm\u00e9nyt, amint meg tal\u00e1lja az egyetlen sort a megadott felt\u00e9tel alapj\u00e1n.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">SELECT\n\tcount(*) \nFROM \n    acc_{account_id}.urls as recordings_urls,\n    acc_{account_id}.recording_data as recording_data,\n    acc_{account_id}.sessions as sessions\nWHERE\n    recording_data.usp_id = sessions.usp_id\n    AND  (  1 = 1  )\n    AND sessions.referrer_id = recordings_urls.id\n    AND  (exists(select id from acc_{account_id}.urls where url  ILIKE '%enterprise_customer.com\/jobs%'))\n    AND r_time &gt; to_timestamp(1547585600)\n    AND r_time =5\n    AND recording_data.num_of_pages &gt; 0 ;\n count\n 32519\n(1 row)\nTime: 1636.637 ms<\/code><\/pre>\n<p><\/p>\n<p>Igen. A be\u00e1gyazott lek\u00e9rdez\u00e9s, amikor k\u00f6rbefogva van\u00a0<code>V\u00c9GE;<\/code>, mindent szupergyorsan csin\u00e1l. A k\u00f6vetkez\u0151 logikus k\u00e9rd\u00e9s az, hogy mi\u00e9rt a lek\u00e9rdez\u00e9sek <code>JOIN<\/code>-ek \u00e9s a be\u00e1gyazott lek\u00e9rdez\u00e9s k\u00fcl\u00f6n-k\u00fcl\u00f6n gyors, de egy\u00fctt borzalmasan lass\u00faak?<\/p>\n<p><\/p>\n<ul>\n<li><strong>A be\u00e1gyazott lek\u00e9rdez\u00e9st \u00e1thelyezz\u00fck CTE-be <\/strong>: ha a lek\u00e9rdez\u00e9s \u00f6n\u00e1ll\u00f3an gyors, egyszer\u0171en el\u0151sz\u00f6r kisz\u00e1m\u00edthatjuk a gyors eredm\u00e9nyt, majd ezt szolg\u00e1ltathatjuk a f\u0151 lek\u00e9rdez\u00e9snek.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">WITH matching_urls AS (\n    select id::text from acc_{account_id}.urls where url  ILIKE  '%enterprise_customer.com\/jobs%'\n)\n\nSELECT \n    count(*) FROM acc_{account_id}.urls as recordings_urls, \n    acc_{account_id}.recording_data as recording_data, \n    acc_{account_id}.sessions as sessions,\n    matching_urls\nWHERE \n    recording_data.usp_id = sessions.usp_id \n    AND  (  1 = 1  )  \n    AND sessions.referrer_id = recordings_urls.id\n    AND (urls &amp;&amp; array(SELECT id from matching_urls)::text[])\n    AND r_time &gt; to_timestamp(1542585600) \n    AND r_time =5 \n    AND recording_data.num_of_pages &gt; 0;<\/code><\/pre>\n<p><\/p>\n<p>De ez m\u00e9g mindig nagyon lass\u00fa volt.<\/p>\n<p><\/p>\n<h2>Megkeress\u00fck a hib\u00e1st<\/h2>\n<p><\/p>\n<p>Ez id\u0151 alatt egy apr\u00f3s\u00e1g folyamatosan a szemem el\u0151tt lebegett, amit mindig elutas\u00edtottam. De mivel m\u00e1r nem volt m\u00e1sra lehet\u0151s\u00e9gem, \u00fagy d\u00f6nt\u00f6ttem, hogy r\u00e1 is pillantok. Azt mondom, hogy a <code>&amp;&amp;<\/code> oper\u00e1tor. M\u00edg <code>V\u00c9GE;<\/code> csak jav\u00edtotta a teljes\u00edtm\u00e9nyt, <code>&amp;&amp;<\/code> az volt az egyetlen k\u00f6z\u00f6s t\u00e9nyez\u0151 a lass\u00fa lek\u00e9rdez\u00e9s minden v\u00e1ltozat\u00e1ban.<\/p>\n<p><\/p>\n<p>N\u00e9zve a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.1\/functions-array.html\">a dokument\u00e1ci\u00f3val<\/a><\/noindex>, l\u00e1tjuk, hogy <code>&amp;&amp;<\/code> akkor haszn\u00e1lj\u00e1k, amikor k\u00f6z\u00f6s elemeket kell tal\u00e1lni k\u00e9t t\u00f6mb k\u00f6z\u00f6tt.<\/p>\n<p><\/p>\n<p>Az eredeti lek\u00e9rdez\u00e9sben ez:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">AND  (  urls &amp;&amp;  array(select id from acc_{account_id}.urls where url  ILIKE  '%enterprise_customer.com\/jobs%')::text[]   )<\/code><\/pre>\n<p><\/p>\n<p>Ami azt jelenti, hogy sablon alapj\u00e1n keres\u00fcnk az URL-jeink k\u00f6z\u00f6tt, majd megtal\u00e1ljuk a k\u00f6z\u00f6s elemeket az \u00f6sszes URL k\u00f6z\u00f6tt, amely k\u00f6z\u00f6s rekordokkal rendelkezik. Ez kicsit zavaros, mivel az \u201eurls\u201d itt nem egy t\u00e1bl\u00e1ra utal, ami minden URL-t tartalmaz, hanem az \u201eurls\u201d oszlopra az <code>recording_data<\/code>.<\/p>\n<p><\/p>\n<p>Ahogy a gyan\u00faim n\u0151ttek a <code>&amp;&amp;<\/code>, megpr\u00f3b\u00e1ltam meger\u0151s\u00edt\u00e9st tal\u00e1lni a lek\u00e9rdez\u00e9s \u00e9rtekezlet\u00e9ben, amely l\u00e9trej\u00f6tt <code>EXPLAIN ANALYZE<\/code> (m\u00e1r volt egy mentett tervem, de \u00e1ltal\u00e1ban k\u00e9nyelmesebb SQL-ben k\u00eds\u00e9rletezni, mint meg\u00e9rteni a lek\u00e9rdez\u00e9s-tervez\u0151k \u00e1ttetsz\u0151s\u00e9g\u00e9t).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Sz\u0171r\u0151: ((urls &amp;&amp; ($0)::text[]) \u00c9S (r_time &gt; '2018-12-17 12:17:23+00'::timestamp with time zone) \u00c9S (r_time = '5'::double precision) \u00c9S (num_of_pages &gt; 0))\n                           Sz\u0171r\u0151 \u00e1ltal elt\u00e1vol\u00edtott sorok: 52710<\/code><\/pre>\n<p><\/p>\n<p>Volt n\u00e9h\u00e1ny sz\u0171r\u0151 sor csak <code>&amp;&amp;<\/code>. Ez azt jelentette, hogy ez a m\u0171velet nemcsak k\u00f6lts\u00e9ges volt, hanem t\u00f6bbsz\u00f6r is v\u00e9grehajt\u00f3dott.<\/p>\n<p><\/p>\n<p>Ezt ellen\u0151riztem, elk\u00fcl\u00f6n\u00edtve a felt\u00e9telt<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">SELECT 1\nFROM \n    acc_{account_id}.urls as recordings_urls, \n    acc_{account_id}.recording_data_30 as recording_data_30, \n    acc_{account_id}.sessions_30 as sessions_30 \nWHERE \n\turls &amp;&amp; array(select id from acc_{account_id}.urls where url ILIKE '%enterprise_customer.com\/jobs%')::text[]<\/code><\/pre>\n<p><\/p>\n<p>Ez a lek\u00e9rdez\u00e9s lassan futott. Mivel <code>JOIN<\/code>-ok gyorsak \u00e9s az als\u00f3 lek\u00e9rdez\u00e9sek gyorsak, csak a <code>&amp;&amp;<\/code> oper\u00e1tor maradt.<\/p>\n<p><\/p>\n<p>Ez a kulcsfontoss\u00e1g\u00fa m\u0171velet. Mindig keresn\u00fcnk kell a f\u0151 URL-t\u00e1bl\u00e1zaton, hogy mint\u00e1ra keress\u00fcnk, \u00e9s mindig meg kell tal\u00e1lnunk a metszeteket. K\u00f6zvetlen\u00fcl nem kereshet\u00fcnk az url feljegyz\u00e9sek k\u00f6z\u00f6tt, mert azok csak ID-k, amelyek <code>urls<\/code>.<\/p>\n<p><\/p>\n<h2>A megold\u00e1s fel\u00e9 vezet\u0151 \u00faton<\/h2>\n<p><\/p>\n<p><code>&amp;&amp;<\/code> lass\u00fa, mivel mindk\u00e9t halmaz hatalmas. A m\u0171velet viszonylag gyors lesz, ha kicser\u00e9lem <code>urls<\/code> Gyorsan eml\u00e9kezz\u00fcnk vissza, hogyan m\u0171k\u00f6dik a modul\u00e1ris aritmetika. Az \u00f3ra m\u00e1r egy ismert koncepci\u00f3. Az \u00f3r\u00e1k haszn\u00e1lata <code>{ \"http:\/\/google.com\/\", \"http:\/\/wingify.com\/\" }<\/code>.<\/p>\n<p><\/p>\n<p>Elkezdtem keresni egy m\u00f3dot, hogy Postgres-ben halmazok metszet\u00e9t k\u00e9pezzem an\u00e9lk\u00fcl, hogy <code>&amp;&amp;<\/code>, de nem t\u00fal nagy sikerrel.<\/p>\n<p><\/p>\n<p>V\u00e9g\u00fcl \u00fagy d\u00f6nt\u00f6tt\u00fcnk, hogy egyszer\u0171en izol\u00e1ltan oldjuk meg a probl\u00e9m\u00e1t: adj meg nekem minden <code>urls<\/code> sorok, amelyekn\u00e9l az URL megfelel a mint\u00e1nak. Tov\u00e1bbi felt\u00e9telek n\u00e9lk\u00fcl ez lesz \u2014\u00a0<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">SELECT urls.url\nFROM \n\tacc_{account_id}.urls as urls,\n\t(SELECT unnest(recording_data.urls) AS id) AS unrolled_urls\nWHERE\n\turls.id = unrolled_urls.id \u00c9S\n\turls.url ILIKE '%jobs%'<\/code><\/pre>\n<p><\/p>\n<p>A\u00a0<code>JOIN<\/code> szintaxisa, egyszer\u0171en als\u00f3 lek\u00e9rdez\u00e9st haszn\u00e1ltam \u00e9s kib\u0151v\u00edtettem <code>recording_data.urls<\/code> t\u00f6mb\u00f6t, hogy k\u00f6zvetlen\u00fcl alkalmazhassam a felt\u00e9telt <code>AHOL<\/code>.<\/p>\n<p><\/p>\n<p>A legfontosabb itt az, hogy <code>&amp;&amp;<\/code> ellen\u0151rzi, hogy a megadott rekord tartalmazza-e a megfelel\u0151 URL-t. Kicsit hunyorogva l\u00e1that\u00f3 ebben a m\u0171veletben az elemekre (vagy t\u00e1bl\u00e1zatsorokra) val\u00f3 l\u00e9pked\u00e9s \u00e9s a felt\u00e9tel (megemelked\u00e9s) teljes\u00edt\u00e9sekor val\u00f3 meg\u00e1ll\u00e1s. Valami ismer\u0151s? Igen, <code>V\u00c9GE;<\/code>.<\/p>\n<p><\/p>\n<p>Mivel a <code>recording_data.urls<\/code> k\u00fcls\u0151 hivatkoz\u00e1sk\u00e9nt hivatkozhat az als\u00f3 lek\u00e9rdez\u00e9s kontextus\u00e1b\u00f3l, amikor ez megt\u00f6rt\u00e9nik, visszat\u00e9rhet\u00fcnk r\u00e9gi bar\u00e1tunkhoz <code>V\u00c9GE;<\/code> \u00e9s burkolhatjuk als\u00f3 lek\u00e9rdez\u00e9sbe.<\/p>\n<p><\/p>\n<p>\u00d6sszegezve, megkapjuk a v\u00e9gs\u0151 optimaliz\u00e1lt lek\u00e9rdez\u00e9st:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">V\u00c1LASSZA KI \n    count(*) \nFROM \n    acc_{account_id}.urls as recordings_urls, \n    acc_{account_id}.recording_data as recording_data, \n    acc_{account_id}.sessions as sessions \nWHERE \n    recording_data.usp_id = sessions.usp_id \n    AND  (  1 = 1  )  \n    AND sessions.referrer_id = recordings_urls.id \n    AND r_time &gt; to_timestamp(1542585600) \n    AND r_time =5 \n    AND recording_data.num_of_pages &gt; 0\n    AND EXISTS(\n        SELECT urls.url\n        FROM \n            acc_{account_id}.urls as urls,\n            (SELECT unnest(urls) AS rec_url_id FROM acc_{account_id}.recording_data) \n            AS unrolled_urls\n        WHERE\n            urls.id = unrolled_urls.rec_url_id AND\n            urls.url  ILIKE  '%enterprise_customer.com\/jobs%'\n    );\n<\/code><\/pre>\n<p><\/p>\n<p>\u00c9s a v\u00e9gs\u0151 v\u00e9grehajt\u00e1si id\u0151 <code>Id\u0151: 1898.717 ms<\/code> Itt az ideje az \u00fcnnepl\u00e9snek?!?<\/p>\n<p><\/p>\n<p>Ne siess! El\u0151sz\u00f6r ellen\u0151rizni kell a helyess\u00e9get. Nagyon gyanakv\u00f3 voltam a\noptimaliz\u00e1ci\u00f3val kapcsolatban, mivel az korai befejez\u00e9st okozhat. Meg kell gy\u0151z\u0151dn\u00fcnk arr\u00f3l, hogy nem adtunk hozz\u00e1\nvalamilyen rejtett hib\u00e1t a lek\u00e9rdez\u00e9shez. <code>V\u00c9GE;<\/code> Az egyszer\u0171 ellen\u0151rz\u00e9s a k\u00f6vetkez\u0151 v\u00e9grehajt\u00e1s\u00e1ra vonatkozott<\/p>\n<p><\/p>\n<p>count(*) <code>\u00e9s mind a lass\u00fa, mind a gyors lek\u00e9rdez\u00e9sek eset\u00e9n k\u00fcl\u00f6nb\u00f6z\u0151 adatmint\u00e1k eset\u00e9n. Ezut\u00e1n egy kis adatmint\u00e1ban\nk\u00e9zzel ellen\u0151riztem az \u00f6sszes eredm\u00e9ny helyess\u00e9g\u00e9t.<\/code> Minden ellen\u0151rz\u00e9s k\u00f6vetkezetesen pozit\u00edv eredm\u00e9nyeket hozott. Minden helyre\u00e1llt!<\/p>\n<p><\/p>\n<p>Tanuls\u00e1gok<\/p>\n<p><\/p>\n<h2>Sz\u00e1mos tanuls\u00e1got vonhatunk le ebb\u0151l a t\u00f6rt\u00e9netb\u0151l:<\/h2>\n<p><\/p>\n<p>A lek\u00e9rdez\u00e9si tervek nem mondj\u00e1k el az eg\u00e9sz t\u00f6rt\u00e9netet, de utal\u00e1sokat adhatnak<\/p>\n<p><\/p>\n<ol>\n<li>A f\u0151 gyan\u00fas\u00edtottak nem mindig a val\u00f3di elk\u00f6vet\u0151k<\/li>\n<li>A lass\u00fa lek\u00e9rdez\u00e9seket fel lehet bontani, hogy izol\u00e1ljunk sz\u0171k keresztmetszeteket<\/li>\n<li>Nem minden optimaliz\u00e1ci\u00f3 term\u00e9szet\u00e9n\u00e9l fogva redukt\u00edv<\/li>\n<li>AZ EXIST<\/li>\n<li>Haszn\u00e1lat <code>, ahol lehets\u00e9ges, jelent\u0151s teljes\u00edtm\u00e9nyn\u00f6veked\u00e9shez vezethet<\/code>\u00c1tment\u00fcnk a lek\u00e9rdez\u00e9si id\u0151nek ~24 percr\u0151l 2 m\u00e1sodpercre \u2014 ez egy jelent\u0151s teljes\u00edtm\u00e9nyn\u00f6veked\u00e9s! B\u00e1r ez a cikk hossz\u00fara sikeredett, minden k\u00eds\u00e9rletet, amit v\u00e9gezt\u00fcnk, egy napon bel\u00fcl\nval\u00f3s\u00edtottunk meg, \u00e9s becsl\u00e9sek szerint 1,5-2 \u00f3r\u00e1t vett ig\u00e9nybe az optimaliz\u00e1l\u00e1sok \u00e9s tesztel\u00e9sek.<\/li>\n<\/ol>\n<p><\/p>\n<h2>K\u00f6vetkeztet\u00e9s<\/h2>\n<p><\/p>\n<p>A SQL csod\u00e1latos nyelv, ha nem f\u00e9l\u00fcnk t\u0151le, hanem pr\u00f3b\u00e1lunk megismerni \u00e9s haszn\u00e1lni. Ha j\u00f3 meg\u00e9rt\u00e9ssel rendelkez\u00fcnk arr\u00f3l, hogyan hajtj\u00e1k v\u00e9gre a SQL-lek\u00e9rdez\u00e9seket, hogyan gener\u00e1lnak a DB lek\u00e9rdez\u00e9si terveket, hogyan m\u0171k\u00f6dnek a indexek \u00e9s csak a m\u00e9retr\u0151l van sz\u00f3, amelyet kezel\u00fcnk, akkor\nnagyon sikeresek lehet\u00fcnk a lek\u00e9rdez\u00e9sek optimaliz\u00e1l\u00e1s\u00e1ban. Nem kev\u00e9sb\u00e9 fontos azonban tov\u00e1bbra is pr\u00f3b\u00e1lkozni k\u00fcl\u00f6nf\u00e9le megk\u00f6zel\u00edt\u00e9sekkel \u00e9s lassan\nbontani a probl\u00e9m\u00e1t, megtal\u00e1lva a sz\u0171k keresztmetszeteket.<\/p>\n<p><\/p>\n<p>Az SQL egy csod\u00e1latos nyelv, ha nem f\u00e9l\u00fcnk t\u0151le, hanem megpr\u00f3b\u00e1ljuk meg\u00e9rteni \u00e9s haszn\u00e1lni. Ha j\u00f3 \u00e1ttekint\u00e9s\u00fcnk van arr\u00f3l, hogyan hajtj\u00e1k v\u00e9gre az SQL lek\u00e9rdez\u00e9seket, hogyan gener\u00e1lja az adatb\u00e1zis a lek\u00e9rdez\u00e9si terveket, hogyan m\u0171k\u00f6dnek az indexek, \u00e9s egyszer\u0171en a kezelt adatok m\u00e9ret\u00e9r\u0151l, akkor jelent\u0151s el\u0151rel\u00e9p\u00e9st \u00e9rhet\u00fcnk el a lek\u00e9rdez\u00e9sek optimaliz\u00e1l\u00e1s\u00e1ban. Ugyanakkor nem kev\u00e9sb\u00e9 fontos, hogy folyamatosan pr\u00f3b\u00e1lgassuk a k\u00fcl\u00f6nb\u00f6z\u0151 megk\u00f6zel\u00edt\u00e9seket \u00e9s fokozatosan bontsuk le a probl\u00e9m\u00e1t, mik\u00f6zben megtal\u00e1ljuk a sz\u0171k keresztmetszeteket.<\/p>\n<p><\/p>\n<p>A legjobb r\u00e9sze az ilyen eredm\u00e9nyek el\u00e9r\u00e9s\u00e9nek a sebess\u00e9g jelent\u0151s, szemmel l\u00e1that\u00f3 javul\u00e1sa - amikor az a jelent\u00e9s, ami kor\u00e1bban m\u00e9g nem is t\u00f6lt\u0151d\u00f6tt be, most szinte azonnal bet\u00f6lt\u0151dik.<\/p>\n<p><\/p>\n<p><strong>K\u00fcl\u00f6n k\u00f6sz\u00f6net\u00a0<\/strong>bar\u00e1taimnak\u00a0<em>Aditya Mishr\u00e1nak<\/em>,\u00a0<em>Aditya Gaurnak\u00a0<\/em>\u00e9s\u00a0<em><noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/s0ftvar\">Varun Malhotr\u00e1nak\u00a0<\/a><\/noindex><\/em>a brainstorming\u00e9rt \u00e9s\u00a0<em>Dinkar Pandirinak\u00a0<\/em>mert felfedezte a kritikus hib\u00e1t a v\u00e9gs\u0151 k\u00e9r\u00e9s\u00fcnkben, miel\u0151tt v\u00e9gleg b\u00facs\u00fat mondtunk volna neki!<\/p>\n<p>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/455832\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0434\u0435\u043a\u0430\u0431\u0440\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 VWO. \u0412\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043f\u043e\u043c\u0435\u0440\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c. \u0410 \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0444\u0435\u0440\u0430 \u043c\u043e\u0435\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u044f \u0442\u0443\u0442 \u0436\u0435 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043e \u0447\u0451\u043c \u0440\u0435\u0447\u044c, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e VWO. \u042d\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, [&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-35259","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=\"\u0412 \u0434\u0435\u043a\u0430\u0431\u0440\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 VWO. \u0412\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043f\u043e\u043c\u0435\u0440\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c.\" \/>\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\/hu\/blog\/administrirovanie\/istoriya-odnogo-sql-rassledovaniya\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e SQL \u0440\u0430\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0434\u0435\u043a\u0430\u0431\u0440\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 VWO. \u0412\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043f\u043e\u043c\u0435\u0440\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/istoriya-odnogo-sql-rassledovaniya\" \/>\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:03:17+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:03:17+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\udd47Egy SQL nyomoz\u00e1s t\u00f6rt\u00e9nete | ProHoster","description":"Tavaly decemberben egy \u00e9rdekes hibajelent\u00e9st kaptam a VWO t\u00e1mogat\u00f3i csapat\u00e1t\u00f3l. Egy neves v\u00e1llalati \u00fcgyf\u00e9l analitikai jelent\u00e9s\u00e9nek bet\u00f6lt\u00e9si ideje elfogadhatatlanul hossz\u00fanak t\u0171nt.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/istoriya-odnogo-sql-rassledovaniya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e SQL \u0440\u0430\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f | ProHoster","og:description":"\u0412 \u0434\u0435\u043a\u0430\u0431\u0440\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 VWO. \u0412\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043f\u043e\u043c\u0435\u0440\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/istoriya-odnogo-sql-rassledovaniya","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:03:17+00:00","article:modified_time":"2019-10-31T19:03:17+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35259","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 22:33:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:07:28","updated":"2026-01-21 22:33:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/35259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=35259"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/35259\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=35259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=35259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=35259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}