{"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\/sq\/blog\/administrirovanie\/istoriya-odnogo-sql-rassledovaniya","title":{"rendered":"Gjuh\u00ebt m\u00eb t\u00eb rralla dhe m\u00eb t\u00eb shtrenjta t\u00eb programimit","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>N\u00eb dhjetor t\u00eb vitit t\u00eb kaluar, mora nj\u00eb raport interesante mbi nj\u00eb problem nga ekipi i mb\u00ebshtetjes VWO. Koha e ngarkes\u00ebs p\u00ebr nj\u00eb nga raportet analitike p\u00ebr nj\u00eb klient t\u00eb madh korporativ dukej jasht\u00ebzakonisht e gjat\u00eb. Dhe pasi kjo \u00ebsht\u00eb n\u00eb sfer\u00ebn e p\u00ebrgjegj\u00ebsis\u00eb time, menj\u00ebher\u00eb u fokusova n\u00eb zgjidhjen e problemit.<\/p>\n<p><\/p>\n<h2>Historia e m\u00ebparshme<\/h2>\n<p><\/p>\n<p>P\u00ebr t\u00eb b\u00ebr\u00eb t\u00eb qart\u00eb p\u00ebr \u00e7far\u00eb b\u00ebhet fjal\u00eb, do t\u00eb tregoj pak p\u00ebr VWO. Kjo \u00ebsht\u00eb nj\u00eb platform\u00eb q\u00eb lejon t\u00eb lancohen fushata t\u00eb ndryshme t\u00eb targetuara n\u00eb faqet e internetit: t\u00eb kryhen eksperimente A\/B, t\u00eb ndjekin vizitor\u00ebt dhe konvertimet, t\u00eb b\u00ebjn\u00eb analiz\u00ebn e funnel-it t\u00eb shitjeve, t\u00eb tregojn\u00eb hartat termike dhe t\u00eb shfaqin regjistrime t\u00eb vizitave.<\/p>\n<p><\/p>\n<p>Por m\u00eb e r\u00ebnd\u00ebsishmja n\u00eb k\u00ebt\u00eb platform\u00eb \u00ebsht\u00eb p\u00ebrgatitja e raporteve. T\u00eb gjitha funksionet e p\u00ebrmendura jan\u00eb t\u00eb lidhuara me nj\u00ebra-tjetr\u00ebn. Dhe p\u00ebr klient\u00ebt korporativ\u00eb, nj\u00eb mas\u00eb e madhe informacioni do t\u00eb ishte thjesht e pavlera pa nj\u00eb platform\u00eb t\u00eb fuqishme q\u00eb e paraqet at\u00eb p\u00ebr analiza.<\/p>\n<p><\/p>\n<p>Duke p\u00ebrdorur platform\u00ebn, mund t\u00eb b\u00ebni nj\u00eb k\u00ebrkes\u00eb t\u00eb rast\u00ebsishme mbi nj\u00eb set t\u00eb madh t\u00eb dh\u00ebnash. Ja nj\u00eb shembull i thjesht\u00eb:<\/p>\n<p><\/p>\n<pre>Trego t\u00eb gjitha klikimet n\u00eb faqen \"abc.com\"\n NGA &lt;data d1&gt; DERi &lt;data d2&gt;\n p\u00ebr ata q\u00eb\n p\u00ebrdor\u00ebn Chrome OSE\n (ishin n\u00eb Evrop\u00eb DHE p\u00ebrdor\u00ebn iPhone)<\/pre>\n<p><\/p>\n<p>Vini re operator\u00ebt boolean. Ata jan\u00eb t\u00eb disponuesh\u00ebm p\u00ebr klient\u00ebt n\u00eb nd\u00ebrfaqen e k\u00ebrkes\u00ebs, p\u00ebr t\u00eb b\u00ebr\u00eb k\u00ebrkesa sa m\u00eb t\u00eb komplikuara q\u00eb t\u00eb jen\u00eb t\u00eb nevojshme p\u00ebr t\u00eb marr\u00eb mostr\u00ebn.<\/p>\n<p><\/p>\n<h2>K\u00ebrkes\u00eb e ngadalt\u00eb<\/h2>\n<p><\/p>\n<p>Klienti q\u00eb po flasim p\u00ebr t\u00eb p\u00ebrpiqej t\u00eb b\u00ebnte di\u00e7ka q\u00eb intuitivisht duhet t\u00eb punonte shpejt:<\/p>\n<p><\/p>\n<pre>Trego t\u00eb gjitha regjistrimet e seancave\n p\u00ebr p\u00ebrdoruesit q\u00eb vizituan \u00e7do faqe\n me url q\u00eb p\u00ebrmban \"\\\/jobs\"<\/pre>\n<p><\/p>\n<p>N\u00eb k\u00ebt\u00eb faqe kishte nj\u00eb sasi t\u00eb madhe trafiku, dhe ne ruanim m\u00eb shum\u00eb se nj\u00eb milion URL unike vet\u00ebm p\u00ebr t\u00eb. Dhe ata donin t\u00eb gjenin nj\u00eb model mjaft t\u00eb thjesht\u00eb URL-je q\u00eb lidhej me modelin e tyre t\u00eb biznesit.<\/p>\n<p>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Hetimi paraprak<\/h2>\n<p><\/p>\n<p>Le t\u00eb shohim se \u00e7far\u00eb po ndodh n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave. M\u00eb posht\u00eb \u00ebsht\u00eb SQL-i origjinal i ngadalsh\u00ebm:<\/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 &lt; to_timestamp(1545177599) \n    AND recording_data.duration &gt;= 5 \n    AND recording_data.num_of_pages &gt; 0 ;<\/code><\/pre>\n<p><\/p>\n<p>Ja koha e ngarkes\u00ebs:<\/p>\n<p><\/p>\n<pre>Koha e planifikuar: 1.480 ms\n Koha e ekzekutimit: 1431924.650 ms<\/pre>\n<p><\/p>\n<p>K\u00ebrkesa kaloi 150 mij\u00eb rreshta. Planifikuesi i k\u00ebrkesave tregoi disa detaje interesante, por asnj\u00eb ngushtic\u00eb t\u00eb dukshme.<\/p>\n<p><\/p>\n<p>Le t\u00eb shqyrtojm\u00eb k\u00ebrkes\u00ebn m\u00eb tej. Si\u00e7 duket, ajo b\u00ebn <code>JOIN<\/code> tre tabela:<\/p>\n<p><\/p>\n<ol>\n<li><strong>sessions<\/strong>: p\u00ebr t\u00eb shfaqur informacionin sesional: shfletuesi, agjenti i p\u00ebrdoruesit, vendi dhe k\u00ebshtu me radh\u00eb.<\/li>\n<li><strong>recording_data<\/strong>: URL-t\u00eb e regjistruara, faqet, koh\u00ebzgjatja e vizitave<\/li>\n<li><strong>urls<\/strong>: p\u00ebr t\u00eb shmangur duplikimin e URL-ve jasht\u00ebzakonisht t\u00eb gjata, ne i ruajm\u00eb ato n\u00eb nj\u00eb tabel\u00eb t\u00eb ve\u00e7ant\u00eb.<\/li>\n<\/ol>\n<p><\/p>\n<p>Gjithashtu, kushtojini v\u00ebmendje faktit q\u00eb t\u00eb gjitha tabelat tona jan\u00eb ndar\u00eb tashm\u00eb <code>account_id<\/code>. K\u00ebshtu, p\u00ebrjashtohet rasti kur p\u00ebr shkak t\u00eb nj\u00eb llogarie t\u00eb ve\u00e7ante t\u00eb madhe, problemet ndodhin p\u00ebr t\u00eb tjer\u00ebt.<\/p>\n<p><\/p>\n<h2>N\u00eb k\u00ebrkim t\u00eb provave<\/h2>\n<p><\/p>\n<p>Kur e shqyrtojm\u00eb m\u00eb nga af\u00ebr, ne shohim se di\u00e7ka n\u00eb k\u00ebt\u00eb k\u00ebrkes\u00eb specifike nuk \u00ebsht\u00eb n\u00eb rregull. Duhet t'i kushtojm\u00eb v\u00ebmendje k\u00ebsaj rreshti:<\/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>Mendimi i par\u00eb ishte se ndoshta p\u00ebr shkak t\u00eb <code>ILIKE<\/code> n\u00eb t\u00eb gjitha k\u00ebto URL t\u00eb gjata (ne kemi m\u00eb shum\u00eb se 1.4 million <strong>URL t\u00eb ve\u00e7ant\u00eb, t\u00eb grumbulluara p\u00ebr k\u00ebt\u00eb llogari) performanca mund t\u00eb ndikohet negativisht.\u00a0<\/strong>Por, jo \u2014 problemi nuk \u00ebsht\u00eb aty!<\/p>\n<p><\/p>\n<p>SELECT id FROM urls WHERE url ILIKE '%enterprise_customer.com\/jobs%';\n  id\n--------\n ...\n(198661 rreshta)\n\nKoha: 5231.765 ms<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">K\u00ebrkesa p\u00ebr k\u00ebrkim me model merr vet\u00ebm 5 sekonda. K\u00ebrkimi me model mbi nj\u00eb milion URL t\u00eb ve\u00e7ant\u00eb sigurisht q\u00eb nuk \u00ebsht\u00eb nj\u00eb problem.<\/code><\/pre>\n<p><\/p>\n<p>Tjetri n\u00eb list\u00ebn e dyshuar \u00ebsht\u00eb disa<\/p>\n<p><\/p>\n<p>. Ndoshta p\u00ebrdorimi i tyre i tepruar ka shkaktuar ngadal\u00ebsim? Zakonisht <code>JOIN<\/code>\u2018t jan\u00eb kandidat\u00ebt m\u00eb t\u00eb duksh\u00ebm p\u00ebr probleme me performanc\u00ebn, por un\u00eb nuk besova se rasti yn\u00eb ishte tipik. <code>JOIN<\/code>\u2018Y\u2019 jan\u00eb kandidat\u00ebt m\u00eb t\u00eb duksh\u00ebm p\u00ebr probleme me performanc\u00ebn, por nuk e besoja se rasti yn\u00eb ishte tipik.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Dhe ky gjithashtu nuk ishte rasti yn\u00eb.<\/code><\/pre>\n<p><\/p>\n<p>\u2018t rezultuan t\u00eb ishin mjaft t\u00eb shpejt\u00eb. <code>JOIN<\/code>\u2018Y\u2019 dol\u00ebn t\u00eb ishin mjaft t\u00eb shpejt\u00eb.<\/p>\n<p><\/p>\n<h2>Isha gati t\u00eb filloja t\u00eb ndryshoja k\u00ebrkes\u00ebn p\u00ebr t\u00eb arritur \u00e7do p\u00ebrmir\u00ebsim t\u00eb mundsh\u00ebm t\u00eb performanc\u00ebs. Ne me ekipin zhvilluam 2 ide kryesore:<\/h2>\n<p><\/p>\n<p>P\u00ebrdorimi i EXISTS p\u00ebr n\u00ebnk\u00ebrkes\u00eb t\u00eb URL-ve<\/p>\n<p><\/p>\n<ul>\n<li><strong>: Donim t\u00eb kontrollonim p\u00ebrs\u00ebri n\u00ebse ka ndonj\u00eb problem me n\u00ebnk\u00ebrkes\u00ebn p\u00ebr URL-t\u00eb. Nj\u00eb nga m\u00ebnyrat p\u00ebr ta arritur k\u00ebt\u00eb \u00ebsht\u00eb thjesht ta p\u00ebrdorim<\/strong>: Ne do d\u00ebshironim t\u00eb verifikonim p\u00ebrs\u00ebri n\u00ebse ka ndonj\u00eb problem me n\u00ebnk\u00ebrkesat p\u00ebr URL-t\u00eb. Nj\u00eb nga m\u00ebnyrat p\u00ebr ta arritur k\u00ebt\u00eb \u00ebsht\u00eb thjesht t\u00eb p\u00ebrdorni <code>EKZISTON<\/code>. <code>EKZISTON<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/functions-subquery.html#FUNCTIONS-SUBQUERY-EXISTS\">mund<\/a><\/noindex> p\u00ebrmir\u00ebson ndjesh\u00ebm performanc\u00ebn, pasi ndalon menj\u00ebher\u00eb, sapo gjen rreshtin e vet\u00ebm sipas kushteve.<\/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 rresht)\nKoha: 1636.637 ms<\/code><\/pre>\n<p><\/p>\n<p>Po, po. N\u00ebnpyetje, kur \u00ebsht\u00eb e mb\u00ebshtjell\u00eb n\u00eb\u00a0<code>EKZISTON<\/code>, b\u00ebn gjith\u00e7ka super t\u00eb shpejt\u00eb. Pyetja tjet\u00ebr logjike \u00ebsht\u00eb, pse k\u00ebrkesa me <code>JOIN<\/code>-at dhe n\u00ebnpyetja vet\u00eb jan\u00eb t\u00eb shpejt\u00eb ve\u00e7 e ve\u00e7, por ngadal\u00ebsojn\u00eb tmerr\u00ebsisht s\u00eb bashku?<\/p>\n<p><\/p>\n<ul>\n<li><strong>Transferojm\u00eb n\u00ebnpyetjen n\u00eb CTE <\/strong>: n\u00ebse k\u00ebrkesa \u00ebsht\u00eb e shpejt\u00eb vet\u00eb, ne mund t\u00eb llogarisim thjesht rezultatin e shpejt\u00eb fillimisht, dhe pastaj t'ia ofrojm\u00eb k\u00ebrkes\u00ebs kryesore<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">ME url t\u00eb p\u00ebrputhura SI (\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>Por edhe kjo ishte akoma shum\u00eb e ngadalt\u00eb.<\/p>\n<p><\/p>\n<h2>Gjejm\u00eb fajtorin<\/h2>\n<p><\/p>\n<p>Gjith\u00eb k\u00ebt\u00eb koh\u00eb nj\u00eb detaj i vog\u00ebl m\u00eb kishte r\u00ebn\u00eb n\u00eb sy, nga i cili un\u00eb vazhdimisht shihja p\u00ebr t\u00eb ikur. Por, pasi nuk kishte m\u00eb asgj\u00eb tjet\u00ebr, vendosa ta shikoj edhe at\u00eb. Po flas p\u00ebr <code>&amp;&amp;<\/code> operatorin. Nd\u00ebrkoh\u00eb <code>EKZISTON<\/code> thjesht p\u00ebrmir\u00ebsoi performanc\u00ebn, <code>&amp;&amp;<\/code> ishte faktori i vet\u00ebm i mbetur i p\u00ebrbashk\u00ebt n\u00eb t\u00eb gjitha versionet e k\u00ebrkes\u00ebs s\u00eb ngadalshme.<\/p>\n<p><\/p>\n<p>Duke par\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.1\/functions-array.html\">dokumentacion<\/a><\/noindex>, ne shohim se <code>&amp;&amp;<\/code> p\u00ebrdoret, kur nevojitet t\u00eb gjenden elementet e p\u00ebrbashk\u00ebta midis dy array.<\/p>\n<p><\/p>\n<p>N\u00eb k\u00ebrkes\u00ebn origjinale kjo \u00ebsht\u00eb:<\/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>\u00c7far\u00eb do t\u00eb thot\u00eb se ne b\u00ebjm\u00eb k\u00ebrkimin me model mbi URL-t\u00eb tona, pastaj gjejm\u00eb nd\u00ebrprerjen me t\u00eb gjitha URL-t\u00eb me regjistrime t\u00eb p\u00ebrbashk\u00ebta. Kjo \u00ebsht\u00eb pak e ngat\u00ebrruar, pasi 'urls' k\u00ebtu nuk i referohet tabeles q\u00eb p\u00ebrmban t\u00eb gjitha URL-t\u00eb, por kolon\u00ebs 'urls' n\u00eb tabel\u00ebn <code>recording_data<\/code>.<\/p>\n<p><\/p>\n<p>Me rritjen e dyshimeve mbi <code>&amp;&amp;<\/code>, p\u00ebrpiqem t'i gjej ata nj\u00eb d\u00ebshmi n\u00eb planin e k\u00ebrkes\u00ebs, t\u00eb gjeneruar <code>EXPLAIN ANALYZE<\/code> (Un\u00eb kam pasur nj\u00eb plan t\u00eb ruajtur, por zakonisht \u00ebsht\u00eb m\u00eb e leht\u00eb p\u00ebr mua t\u00eb eksperimentohem n\u00eb SQL sesa t\u00eb kuptoj paqart\u00ebsit\u00eb e planifikuesve t\u00eb pyetjeve).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Filtri: ((urls &amp;&amp; ($0)::text[]) DHE (r_time &gt; '2018-12-17 12:17:23+00'::timestamp me zon\u00eb kohore) DHE (r_time = '5'::double precision) DHE (num_of_pages &gt; 0))\n                           Rreshtat e hequr nga Filtri: 52710<\/code><\/pre>\n<p><\/p>\n<p>Ishte disa rreshta filtrash vet\u00ebm nga <code>&amp;&amp;<\/code>. Kjo do t\u00eb thoshte se kjo operacion jo vet\u00ebm q\u00eb ishte e shtrenjt\u00eb, por gjithashtu u ekzekutua disa her\u00eb.<\/p>\n<p><\/p>\n<p>E kontrollova k\u00ebt\u00eb, duke izoluar kushtin<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">SELECT 1\nFROM \n    acc_{account_id}.urls si recordings_urls, \n    acc_{account_id}.recording_data_30 si recording_data_30, \n    acc_{account_id}.sessions_30 si sessions_30 \nKU \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>Kjo pyetje ishte duke u ekzekutuar ngadal\u00eb. Pavar\u00ebsisht se <code>JOIN<\/code>-t jan\u00eb t\u00eb shpejt\u00eb dhe n\u00ebnpyetjet jan\u00eb t\u00eb shpejta, mbeti vet\u00ebm <code>&amp;&amp;<\/code> operatori.<\/p>\n<p><\/p>\n<p>Kjo \u00ebsht\u00eb nj\u00eb operacion ky\u00e7. Ne gjithmon\u00eb duhet t\u00eb k\u00ebrkojm\u00eb n\u00eb t\u00eb gjith\u00eb tabel\u00ebn kryesore t\u00eb URL-ve p\u00ebr t\u00eb k\u00ebrkuar sipas modelit, dhe ne gjithmon\u00eb duhet t\u00eb gjejm\u00eb nd\u00ebrthurje. Ne nuk mund t\u00eb k\u00ebrkojm\u00eb drejtp\u00ebrdrejt n\u00eb regjistrimet e URLs, sepse k\u00ebto jan\u00eb thjesht identifikues q\u00eb referohen n\u00eb <code>urls<\/code>.<\/p>\n<p><\/p>\n<h2>N\u00eb rrug\u00ebn drejt zgjidhjes<\/h2>\n<p><\/p>\n<p><code>&amp;&amp;<\/code> e ngadalt\u00eb, sepse t\u00eb dy grupe jan\u00eb t\u00eb m\u00ebdha. Operacioni do t\u00eb jet\u00eb relativisht i shpejt\u00eb n\u00ebse z\u00ebvend\u00ebsoj <code>urls<\/code> n\u00eb <code>{ \"http:\/\/google.com\/\", \"http:\/\/wingify.com\/\" }<\/code>.<\/p>\n<p><\/p>\n<p>Fillova t\u00eb k\u00ebrkoj nj\u00eb m\u00ebnyr\u00eb p\u00ebr t\u00eb b\u00ebr\u00eb n\u00eb Postgres nd\u00ebrthurje setesh pa p\u00ebrdorimin <code>&amp;&amp;<\/code>, por pa sukses t\u00eb ve\u00e7ant\u00eb.<\/p>\n<p><\/p>\n<p>N\u00eb fund, ne vendos\u00ebm thjesht ta zgjidhnim problemin n\u00eb m\u00ebnyr\u00eb t\u00eb izoluar: m\u00eb jep t\u00eb gjitha <code>urls<\/code> rreshtat, p\u00ebr t\u00eb cilat URL-ja p\u00ebrputhet me modelin. Pa kushte t\u00eb tjera, kjo do t\u00eb ishte \u2014\u00a0<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">SELECT urls.url\nFROM \n\tacc_{account_id}.urls si urls,\n\t(SELECT unnest(recording_data.urls) SI id) SI unrolled_urls\nKU\n\turls.id = unrolled_urls.id DHE\n\turls.url ILIKE '%jobs%'<\/code><\/pre>\n<p><\/p>\n<p>N\u00eb vend t\u00eb\u00a0<code>JOIN<\/code> me sintaks\u00eb un\u00eb thjesht p\u00ebrdor pyesjen n\u00ebn dhe shpalosa <code>recording_data.urls<\/code> n\u00eb nj\u00eb array, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb mund t\u00eb aplikojm\u00eb drejtp\u00ebrdrejt kushtin n\u00eb <code>KU<\/code>.<\/p>\n<p><\/p>\n<p>E r\u00ebnd\u00ebsishme k\u00ebtu \u00ebsht\u00eb se <code>&amp;&amp;<\/code> p\u00ebrdoret p\u00ebr t\u00eb kontrolluar n\u00ebse ky regjistrim p\u00ebrmban URL-n\u00eb p\u00ebrkat\u00ebse. Duke mbyllur pak syt\u00eb, mund t\u00eb shihni n\u00eb k\u00ebt\u00eb operacion l\u00ebvizjen p\u00ebrmes element\u00ebve t\u00eb array-t (ose rreshtave t\u00eb tabel\u00ebs) dhe ndalimin n\u00eb p\u00ebrfundimin e kushtit (p\u00ebrputhjes). A ka ndonj\u00eb gj\u00eb q\u00eb ju kujton? Po, <code>EKZISTON<\/code>.<\/p>\n<p><\/p>\n<p>Pasi n\u00eb <code>recording_data.urls<\/code> mund t\u00eb referohet jasht\u00eb kontekstit t\u00eb n\u00ebnpyetjes, kur ndodh, ne mund t\u00eb kthehemi te shoku yn\u00eb i vjet\u00ebr <code>EKZISTON<\/code> dhe ta mb wrapped n\u00ebnpyetjen.<\/p>\n<p><\/p>\n<p>Duke bashkuar gjith\u00e7ka s\u00eb bashku, ne marrim pyetjen e optimizuar p\u00ebrfundimtare:<\/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  (  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>Dhe koha e fundit e ekzekutimit <code>Koha: 1898.717 ms<\/code> \u00cbsht\u00eb koha p\u00ebr t\u00eb festuar?!?<\/p>\n<p><\/p>\n<p>Jo kaq shpejt! S\u00eb pari, duhet t\u00eb kontrollojm\u00eb sakt\u00ebsin\u00eb. Kam qen\u00eb jasht\u00ebzakonisht i dyshimt\u00eb p\u00ebr <code>EKZISTON<\/code> optimizimin, pasi ai ndryshon logjik\u00ebn n\u00eb nj\u00eb p\u00ebrfundim m\u00eb t\u00eb hersh\u00ebm. Duhet t\u00eb jemi t\u00eb sigurt se nuk kemi shtuar ndonj\u00eb gabim t\u00eb paqart\u00eb n\u00eb k\u00ebrkes\u00eb.<\/p>\n<p><\/p>\n<p>Kontrolli i thjesht\u00eb p\u00ebrfshinte ekzekutimin <code>count(*)<\/code> dhe n\u00eb k\u00ebrkesat e ngadalta dhe t\u00eb shpejta p\u00ebr shum\u00eb grupe t\u00eb ndryshme t\u00eb t\u00eb dh\u00ebnave. M\u00eb pas, p\u00ebr nj\u00eb n\u00ebngrup t\u00eb vog\u00ebl t\u00eb t\u00eb dh\u00ebnave, kontrollova sakt\u00ebsin\u00eb e t\u00eb gjitha rezultateve me dor\u00eb.<\/p>\n<p><\/p>\n<p>T\u00eb gjitha kontrollimet dhan\u00eb rezultate pozitivisht t\u00eb q\u00ebndrueshme. Ne e rregulluam gjith\u00e7ka!<\/p>\n<p><\/p>\n<h2>M\u00ebsimet e nxjerra<\/h2>\n<p><\/p>\n<p>Nga kjo histori mund t\u00eb nxjerrim shum\u00eb m\u00ebsime:<\/p>\n<p><\/p>\n<ol>\n<li>Planet e k\u00ebrkesave nuk tregojn\u00eb gjith\u00e7ka, por mund t\u00eb japin sugjerime<\/li>\n<li>Kryesit\u00eb e dyshuara nuk jan\u00eb gjithmon\u00eb fajtor\u00ebt e v\u00ebrtet\u00eb<\/li>\n<li>K\u00ebrkesat e ngadalta mund t\u00eb ndahen p\u00ebr t\u00eb izoluar ngushticat<\/li>\n<li>Nuk jan\u00eb t\u00eb gjitha optimizimet me natyr\u00eb reduktive<\/li>\n<li>P\u00ebrdorimi <code>EXIST<\/code>, ku \u00ebsht\u00eb e mundur, mund t\u00eb \u00e7oj\u00eb n\u00eb nj\u00eb rritje t\u00eb madhe t\u00eb performanc\u00ebs<\/li>\n<\/ol>\n<p><\/p>\n<h2>P\u00ebrfundimi<\/h2>\n<p><\/p>\n<p>Kemi kaluar nga koha e k\u00ebrkes\u00ebs n\u00eb ~24 minuta n\u00eb 2 sekonda \u2014 nj\u00eb rritje shum\u00eb t\u00eb konsiderueshme t\u00eb performanc\u00ebs! Megjith\u00ebse ky artikull \u00ebsht\u00eb i gjat\u00eb, t\u00eb gjitha eksperimetet q\u00eb kemi b\u00ebr\u00eb ndodhi n\u00eb nj\u00eb dit\u00eb, dhe sipas p\u00ebrllogaritjeve, mor\u00ebn rreth 1.5 deri n\u00eb 2 or\u00eb p\u00ebr optimizim dhe testim.<\/p>\n<p><\/p>\n<p>SQL \u00ebsht\u00eb nj\u00eb gjuh\u00eb e mrekullueshme, n\u00ebse nuk e frik\u00ebsoni, por p\u00ebrpiqeni ta kuptoni dhe ta p\u00ebrdorni. Duke pasur nj\u00eb kuptim t\u00eb mir\u00eb t\u00eb m\u00ebnyr\u00ebs se si ekzekutohen k\u00ebrkesat SQL, si gjeneron DB planet e k\u00ebrkesave, si funksionojn\u00eb indekset dhe thjesht madh\u00ebsia e t\u00eb dh\u00ebnave me t\u00eb cilat po merremi, do t\u00eb jeni n\u00eb gjendje t\u00eb p\u00ebrparoni shum\u00eb n\u00eb optimizimin e k\u00ebrkesave. Po aq e r\u00ebnd\u00ebsishme, megjithat\u00eb, \u00ebsht\u00eb t\u00eb vazhdoni t\u00eb provoni qasje t\u00eb ndryshme dhe ngadal\u00eb t\u00eb ndani problemin, duke gjetur ngushticat.<\/p>\n<p><\/p>\n<p>Pjesa m\u00eb e mir\u00eb e arritjes s\u00eb rezultateve t\u00eb tilla \u00ebsht\u00eb p\u00ebrmir\u00ebsimi i duksh\u00ebm i shpejt\u00ebsis\u00eb \u2014 kur nj\u00eb raport q\u00eb m\u00eb par\u00eb nuk ngarkohej, tani ngarkohet pothuajse menj\u00ebher\u00eb.<\/p>\n<p><\/p>\n<p><strong>Faleminderit t\u00eb ve\u00e7ant\u00eb\u00a0<\/strong>shok\u00ebve t\u00eb mi\u00a0<em>n\u00eb ekipin e Aditya Mishra<\/em>,\u00a0<em>Aditya Gaur\u00a0<\/em>dhe\u00a0<em><noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/s0ftvar\">Varun Malhotra\u00a0<\/a><\/noindex><\/em>p\u00ebr brainstormin dhe\u00a0<em>Dinkar Pandir\u00a0<\/em>p\u00ebr gjetjen e nj\u00eb gabimi t\u00eb r\u00ebnd\u00ebsish\u00ebm n\u00eb k\u00ebrkes\u00ebn ton\u00eb p\u00ebrfundimtare, para se t\u00eb ndahemi me t\u00eb p\u00ebrfundimisht!<\/p>\n<p>Burimi: <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.2 - 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\/sq\/blog\/administrirovanie\/istoriya-odnogo-sql-rassledovaniya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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\udd47Historia e nj\u00eb hetimi SQL | ProHoster","description":"N\u00eb dhjetor t\u00eb vitit t\u00eb kaluar, mora nj\u00eb raport interesant p\u00ebr nj\u00eb gabim nga ekipi i mb\u00ebshtetjes VWO. Koha e ngarkes\u00ebs s\u00eb nj\u00ebrit prej raporteve analitike p\u00ebr nj\u00eb klient t\u00eb madh korporativ dukeshin tep\u00ebr e gjat\u00eb.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/istoriya-odnogo-sql-rassledovaniya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/35259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=35259"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/35259\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=35259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=35259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=35259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}