{"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":"Historia e nj\u00eb hetimi SQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>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 p\u00ebr nj\u00eb nga raportet analitik\u00eb p\u00ebr nj\u00eb klient t\u00eb madh korporativ dukeshin t\u00eb tep\u00ebrta. Dhe, d\u00ebshmimi p\u00ebr k\u00ebt\u00eb \u00ebsht\u00eb n\u00eb fush\u00ebn time t\u00eb p\u00ebrgjegj\u00ebsis\u00eb, prandaj menj\u00ebher\u00eb p\u00ebrqendrova n\u00eb zgjidhjen e problemit.<\/p>\n<p><\/p>\n<h2>Pas historia<\/h2>\n<p><\/p>\n<p>P\u00ebr ta b\u00ebr\u00eb m\u00eb t\u00eb qart\u00eb p\u00ebr \u00e7far\u00eb b\u00ebhet fjal\u00eb, do t\u00eb flas pak p\u00ebr VWO. Kjo \u00ebsht\u00eb nj\u00eb platform\u00eb q\u00eb mund\u00ebson t\u00eb shkaktoni fushata t\u00eb ndryshme t\u00eb targetuara n\u00eb faqet tuaja: t\u00eb realizoni eksperimente A\/B, t\u00eb ndjekni vizitor\u00ebt dhe konversat, t\u00eb analizoni funnel-in e shitjeve, t\u00eb shfaqni hartat e nxeht\u00ebsis\u00eb dhe t\u00eb riprodhoni regjistrimet e vizitave.<\/p>\n<p><\/p>\n<p>Por, ajo q\u00eb \u00ebsht\u00eb m\u00eb e r\u00ebnd\u00ebsishmja n\u00eb k\u00ebt\u00eb platform\u00eb \u00ebsht\u00eb p\u00ebrgatitja e raporteve. T\u00eb gjitha funksionet e m\u00ebsip\u00ebrme jan\u00eb t\u00eb lidhura me nj\u00ebra-tjetr\u00ebn. Dhe p\u00ebr klient\u00ebt korporativ\u00eb, nj\u00eb masiv i madh informacioni do t\u00eb ishte thjesht i padobish\u00ebm pa nj\u00eb platform\u00eb t\u00eb fuqishme q\u00eb e paraqet at\u00eb p\u00ebr analiz\u00eb.<\/p>\n<p><\/p>\n<p>Duke p\u00ebrdorur platform\u00ebn, mund t\u00eb b\u00ebni k\u00ebrkesa t\u00eb rast\u00ebsishme n\u00eb nj\u00eb baz\u00eb t\u00eb madhe 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\"\nNga <data> DERI n\u00eb <data>\np\u00ebr njer\u00ebzit q\u00eb\np\u00ebrdor\u00ebn Chrome OSE\n(q\u00eb ishin n\u00eb Evrop\u00eb DHE p\u00ebrdor\u00ebn iPhone)<\/pre>\n<p><\/p>\n<p>Kujdesi p\u00ebr operator\u00ebt logjik\u00eb. Ata jan\u00eb n\u00eb dispozicion p\u00ebr klient\u00ebt n\u00eb nd\u00ebrfaqen e k\u00ebrkimit, p\u00ebr t\u00eb b\u00ebr\u00eb k\u00ebrkesa t\u00eb nd\u00ebrlikuara p\u00ebr t\u00eb marr\u00eb mostra.<\/p>\n<p><\/p>\n<h2>K\u00ebrkes\u00eb e ngadalt\u00eb<\/h2>\n<p><\/p>\n<p>Klienti n\u00eb fjal\u00eb po p\u00ebrpiqej t\u00eb b\u00ebnte di\u00e7ka q\u00eb intuitivisht duhet t\u00eb funksiononte shpejt:<\/p>\n<p><\/p>\n<pre>Trego t\u00eb gjith\u00eb regjistrat e sesioneve\np\u00ebr p\u00ebrdoruesit q\u00eb vizituan \u00e7do faqe\nme url q\u00eb p\u00ebrmban \"\/jobs\"<\/pre>\n<p><\/p>\n<p>Ky sit pati nj\u00eb sasi t\u00eb madhe trafiku, dhe ne ruajm\u00eb 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 relativisht t\u00eb thjesht\u00eb URL-je t\u00eb lidhur 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 \u00e7far\u00eb po ndodh n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave. M\u00eb posht\u00eb \u00ebsht\u00eb k\u00ebrkesa e ngadalshme SQL origjinale:<\/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>Ja k\u00ebtu jan\u00eb koha:<\/p>\n<p><\/p>\n<pre>Koha e planifikuar: 1.480 ms\nKoha e ekzekutimit: 1431924.650 ms<\/pre>\n<p><\/p>\n<p>K\u00ebrkesa kaloi 150,000 rreshta. Planifikuesi i k\u00ebrkesave tregoi disa detaje interesante, por nuk kishte ndonj\u00eb pik\u00eb evidente ngushtimi.<\/p>\n<p><\/p>\n<p>Le t\u00eb eksplorojm\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 treguar informacionin mbi sesionin: 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 dyfishimin e URL-ve jasht\u00ebzakonisht t\u00eb m\u00ebdha, 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 vini re se t\u00eb gjitha tabelat tona jan\u00eb tashm\u00eb t\u00eb ndara sipas <code>account_id<\/code>. K\u00ebshtu, situata kur nj\u00eb llogari jasht\u00ebzakonisht e madhe shkakton probleme p\u00ebr t\u00eb tjer\u00ebt \u00ebsht\u00eb p\u00ebrjashtuar.<\/p>\n<p><\/p>\n<h2>N\u00eb k\u00ebrkim t\u00eb provave<\/h2>\n<p><\/p>\n<p>Duke shqyrtimit t\u00eb af\u00ebrt, ne shohim se di\u00e7ka n\u00eb k\u00ebrkes\u00ebn specifike nuk \u00ebsht\u00eb n\u00eb rregull. \u00cbsht\u00eb e nevojshme t\u00eb shikoni k\u00ebt\u00eb rresht:<\/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 milion <strong>unikale\u00a0<\/strong>URL adresash t\u00eb mbledhura p\u00ebr k\u00ebt\u00eb llogari) performanca mund t\u00eb ishte e dob\u00ebt.<\/p>\n<p><\/p>\n<p>Por, jo \u2014 nuk \u00ebsht\u00eb kjo!<\/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 rows)\n\nKoha: 5231.765 ms<\/code><\/pre>\n<p><\/p>\n<p>E gjith\u00eb k\u00ebrkesa p\u00ebr k\u00ebrkimin me model merr vet\u00ebm 5 sekonda. K\u00ebrkimi me model n\u00eb nj\u00eb milion URL unike nuk \u00ebsht\u00eb qart\u00eb nj\u00eb problem.<\/p>\n<p><\/p>\n<p>T\u00eb dyshuarit e radh\u00ebs n\u00eb list\u00eb \u2014 disa <code>JOIN<\/code>. Ndoshta p\u00ebrdorimi i tyre t\u00eb tep\u00ebrt ka \u00e7uar n\u00eb ngadal\u00ebsim? Zakonisht <code>JOIN<\/code>&#8216;\u044b \u2014 \u0441\u0430\u043c\u044b\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u044b \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u043d\u043e \u044f \u043d\u0435 \u0432\u0435\u0440\u0438\u043b, \u0447\u0442\u043e \u043d\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439 \u0442\u0438\u043f\u043e\u0432\u043e\u0439.<\/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 row)\n\nKoha: 147.851 ms<\/code><\/pre>\n<p><\/p>\n<p>Dhe kjo gjithashtu nuk ishte rasti yn\u00eb. <code>JOIN<\/code>&#8216;\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u0438.<\/p>\n<p><\/p>\n<h2>Ngushtojm\u00eb rrethin e t\u00eb dyshuarve<\/h2>\n<p><\/p>\n<p>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 si ekip zhvilluam dy ide kryesore:<\/p>\n<p><\/p>\n<ul>\n<li><strong>T\u00eb p\u00ebrdorim EXISTS p\u00ebr n\u00ebnk\u00ebrkes\u00ebn e URL-ve<\/strong>: Donim ta kontrollonim p\u00ebrs\u00ebri n\u00ebse kishte 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 t\u00eb p\u00ebrdorim <code>EXISTS<\/code>. <code>EXISTS<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/functions-subquery.html#FUNCTIONS-SUBQUERY-EXISTS\">mund<\/a><\/noindex> t\u00eb p\u00ebrmir\u00ebsojm\u00eb ndjesh\u00ebm performanc\u00ebn pasi p\u00ebrfundon menj\u00ebher\u00eb sapo gjen nj\u00eb rresht t\u00eb 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 row)\nTime: 1636.637 ms<\/code><\/pre>\n<p><\/p>\n<p>Po, po. N\u00ebnk\u00ebrkesa, kur \u00ebsht\u00eb e mb\u00ebshtjell\u00eb n\u00eb\u00a0<code>EXISTS<\/code>, e b\u00ebn gjith\u00e7ka super t\u00eb shpejt\u00eb. Pyetja logjike tjet\u00ebr \u00ebsht\u00eb pse k\u00ebrkesa me <code>JOIN<\/code>-at dhe vet\u00eb n\u00ebnk\u00ebrkesa jan\u00eb t\u00eb shpejta ve\u00e7 e ve\u00e7, por ngadal\u00ebsohen shum\u00eb s\u00eb bashku?<\/p>\n<p><\/p>\n<ul>\n<li><strong>Po e transferojm\u00eb n\u00ebnk\u00ebrkes\u00ebn n\u00eb CTE <\/strong>: n\u00ebse k\u00ebrkesa \u00ebsht\u00eb e shpejt\u00eb vet\u00eb, ne mund thjesht fillimisht t\u00eb kalkulojm\u00eb nj\u00eb rezultat t\u00eb shpejt\u00eb dhe pastaj t'ia ofrojm\u00eb k\u00ebrkes\u00ebs kryesore<\/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>Por kjo ende ishte shum\u00eb e ngadalshme.<\/p>\n<p><\/p>\n<h2>Gjejm\u00eb fajtorin<\/h2>\n<p><\/p>\n<p>Gjat\u00eb gjith\u00eb k\u00ebsaj kohe, nj\u00eb detaj i vog\u00ebl q\u00eb un\u00eb vazhdimisht e injoroja shfaqej para syve. Por meqen\u00ebse nuk kishte mbetur asgj\u00eb tjet\u00ebr, vendosa ta shikoj at\u00eb. Po flas p\u00ebr <code>&amp;&amp;<\/code> operatorin. Deri tani <code>EXISTS<\/code> thjesht p\u00ebrmir\u00ebsova 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 ngadalt\u00eb.<\/p>\n<p><\/p>\n<p>Duke par\u00eb n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.1\/functions-array.html\">dokumentacioni<\/a><\/noindex>, ne shohim se <code>&amp;&amp;<\/code> p\u00ebrdoret kur nevojitet t\u00eb gjejm\u00eb elementet e p\u00ebrbashk\u00ebta midis dy vendeve.<\/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>Kjo do t\u00eb thot\u00eb q\u00eb ne b\u00ebjm\u00eb nj\u00eb k\u00ebrkim sipas modelit n\u00eb URL-t\u00eb tona dhe pastaj gjejm\u00eb p\u00ebrputhjet me t\u00eb gjitha URL-t\u00eb me regjistrime t\u00eb ngjashme. Kjo \u00ebsht\u00eb paksa e komplikuar, sepse \"urls\" k\u00ebtu nuk i referohet nj\u00eb tabel\u00eb q\u00eb p\u00ebrmban t\u00eb gjitha URL-t\u00eb, por nj\u00eb kolone \"urls\" n\u00eb tabel\u00eb. <code>recording_data<\/code>.<\/p>\n<p><\/p>\n<p>Me rritjen e dyshimeve n\u00eb lidhje me <code>&amp;&amp;<\/code>, p\u00ebrpiqesha t\u00eb gjeja nj\u00eb konfirmim n\u00eb planin e pyetjes, t\u00eb krijuar <code>EXPLAIN ANALYZE<\/code> (un\u00eb tashm\u00eb kisha nj\u00eb plan t\u00eb ruajtur, por zakonisht m\u00eb p\u00eblqen t\u00eb eksperimentoj n\u00eb SQL sesa t\u00eb p\u00ebrpiqem t\u00eb kuptoj paqart\u00ebsit\u00eb e planifikuesve t\u00eb pyetjes).<\/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 hequra nga Filtro: 52710<\/code><\/pre>\n<p><\/p>\n<p>Ishin disa rreshta filtrash vet\u00ebm nga <code>&amp;&amp;<\/code>. Kjo do t\u00eb thoshte q\u00eb 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 \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>Kjo pyetje u ekzekutua ngadal\u00eb. Pasi <code>JOIN<\/code>-at 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 gjithmon\u00eb duhet t\u00eb gjejm\u00eb nd\u00ebrthurje. Nuk mund t\u00eb k\u00ebrkojm\u00eb direkt n\u00eb regjistrimet e URL-ve, sepse ato jan\u00eb vet\u00ebm 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> i ngadalt\u00eb, sepse t\u00eb dyja grumbujt jan\u00eb t\u00eb m\u00ebdhenj. Operacioni do t\u00eb jet\u00eb relativisht i shpejt\u00eb n\u00ebse un\u00eb 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 t\u00eb grumbujve pa p\u00ebrdorur <code>&amp;&amp;<\/code>, por pa shum\u00eb sukses.<\/p>\n<p><\/p>\n<p>N\u00eb fund, ne vendos\u00ebm thjesht ta zgjidhim problemin n\u00eb izolim: m\u00eb jep t\u00eb gjitha <code>urls<\/code> \u0441\u0442\u0440\u043e\u043a\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0440\u043b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u0443. \u0411\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 &#8212;\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 AND\n\turls.url  ILIKE  '%jobs%'<\/code><\/pre>\n<p><\/p>\n<p>N\u00eb vend t\u00eb\u00a0<code>JOIN<\/code> sintaks\u00ebn e p\u00ebrdora thjesht nj\u00eb n\u00ebnkat disa dhe shpalosa <code>recording_data.urls<\/code> n\u00eb nj\u00eb array, p\u00ebr t\u00eb aplikuar kushte direkt n\u00eb <code>WHERE<\/code>.<\/p>\n<p><\/p>\n<p>E r\u00ebnd\u00ebsishme k\u00ebtu \u00ebsht\u00eb q\u00eb <code>&amp;&amp;<\/code> p\u00ebrdoret p\u00ebr t\u00eb verifikuar n\u00ebse ky rekord p\u00ebrmban nj\u00eb URL p\u00ebrkat\u00ebse. Duke e shtyr\u00eb pak, mund ta shihni q\u00eb kjo operacion paraqet l\u00ebvizjen p\u00ebrmes elementeve t\u00eb array (ose rreshtave t\u00eb tabel\u00ebs) dhe ndalet kur plot\u00ebsohet kushti (p\u00ebrputhja). A ju duket e njohur? Po, <code>EXISTS<\/code>.<\/p>\n<p><\/p>\n<p>Duke qen\u00eb se n\u00eb <code>recording_data.urls<\/code> mund t\u00eb referohet jasht\u00eb kontekstit t\u00eb n\u00ebnshtres\u00ebs, kur ndodh kjo, mund t\u00eb kthehemi te shoku yn\u00eb i vjet\u00ebr <code>EXISTS<\/code> dhe ta mb\u00ebshtjellim me t\u00eb n\u00ebnshtres\u00ebn.<\/p>\n<p><\/p>\n<p>Duke e bashkuar gjith\u00e7ka, marrim k\u00ebrkes\u00ebn p\u00ebrfundimtare t\u00eb optimizuar:<\/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 p\u00ebrfundimtare 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 shum\u00eb dyshimtar p\u00ebr <code>EXISTS<\/code> optimizimi, pasi ajo ndryshon logjik\u00ebn p\u00ebr nj\u00eb p\u00ebrfundim m\u00eb t\u00eb hersh\u00ebm. Duhet t\u00eb jemi t\u00eb sigurt se nuk kemi shtuar nj\u00eb gabim t\u00eb paduksh\u00ebm n\u00eb k\u00ebrkes\u00eb.<\/p>\n<p><\/p>\n<p>Kontrolli i thjesht\u00eb p\u00ebrfshinte ekzekutimin e <code>count(*)<\/code> n\u00eb k\u00ebrkesat e ngadalta dhe t\u00eb shpejta p\u00ebr nj\u00eb sasi t\u00eb madhe t\u00eb grupeve t\u00eb ndryshme t\u00eb t\u00eb dh\u00ebnave. Pastaj, p\u00ebr nj\u00eb n\u00ebnset t\u00eb vog\u00ebl t\u00eb t\u00eb dh\u00ebnave, kontrollova sakt\u00ebsin\u00eb e t\u00eb gjitha rezultateve manualisht.<\/p>\n<p><\/p>\n<p>T\u00eb gjitha kontrollimet dhan\u00eb rezultate pozitivisht konstante. Kemi rregulluar gjith\u00e7ka!<\/p>\n<p><\/p>\n<h2>M\u00ebsimet e Nxjerra<\/h2>\n<p><\/p>\n<p>Nga kjo histori mund t\u00eb nxirren mjaft m\u00ebsime:<\/p>\n<p><\/p>\n<ol>\n<li>Planet e k\u00ebrkesave nuk tregojn\u00eb t\u00ebr\u00eb historin\u00eb, por mund t\u00eb japin pista.<\/li>\n<li>T\u00eb dyshuarit kryesor\u00eb 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 pengesat.<\/li>\n<li>Jo t\u00eb gjitha optimizimet jan\u00eb natyrsh\u00ebm reduktive.<\/li>\n<li>P\u00ebrdorimi <code>EXIST<\/code>, kur \u00ebsht\u00eb e mundur, mund t\u00eb \u00e7oj\u00eb n\u00eb nj\u00eb rritje t\u00eb konsiderueshme t\u00eb performanc\u00ebs.<\/li>\n<\/ol>\n<p><\/p>\n<h2>P\u00ebrfundim<\/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 mjaft serioze e performanc\u00ebs! Edhe pse ky artikull ishte i gjat\u00eb, t\u00eb gjitha eksperimentet q\u00eb kemi kryer ndodh\u00ebn n\u00eb nj\u00eb dit\u00eb dhe p\u00ebrllogaritjet tregojn\u00eb se zgjat\u00ebn nga 1.5 deri n\u00eb 2 or\u00eb p\u00ebr optimizimet dhe testimin.<\/p>\n<p><\/p>\n<p>SQL \u2014 nj\u00eb gjuh\u00eb e mrekullueshme n\u00ebse nuk e frik\u00ebsosh, por p\u00ebrpiqesh ta kuptosh dhe ta p\u00ebrdor\u00ebsh. Duke pasur nj\u00eb kuptim t\u00eb mir\u00eb se si ekzekutohen k\u00ebrkesat SQL, si gjenerojn\u00eb DB planet e k\u00ebrkesave, si funksionojn\u00eb indeksat dhe thjesht duke njohur madh\u00ebsin\u00eb e t\u00eb dh\u00ebnave me t\u00eb cilat po merresh, do t\u00eb jesh shum\u00eb i suksessh\u00ebm n\u00eb optimizimin e k\u00ebrkesave. E r\u00ebnd\u00ebsishme \u00ebsht\u00eb gjithashtu t\u00eb vazhdosh t\u00eb provosh qasje t\u00eb ndryshme dhe ngadal\u00eb t\u00eb shk\u00ebput\u00ebsh problemin, duke gjetur piketat e ngushta.<\/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 s\u00eb funksionimit \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>Fal\u00ebnderim t\u00eb ve\u00e7ant\u00eb\u00a0<\/strong>miqve t\u00eb mi\u00a0<em>n\u00eb ekipin 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 mendimet 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 ne t\u00eb ndaheshim me t\u00eb!<\/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.0.1 - 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. \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,\" \/>\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.0.1\" \/>\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. \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,\" \/>\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 mbi nj\u00eb gabim nga ekipi i mb\u00ebshtetjes VWO. Koha e ngarkimit t\u00eb nj\u00eb prej raporteve analitike p\u00ebr nj\u00eb klient t\u00eb madh korporativ dukej jasht\u00ebzakonisht e gjat\u00eb. Duke qen\u00eb se kjo \u00ebsht\u00eb sfera ime e p\u00ebrgjegj\u00ebsis\u00eb, menj\u00ebher\u00eb u p\u00ebrqendrova n\u00eb zgjidhjen e problemit. Sfondi P\u00ebr t\u00eb kuptuar p\u00ebr \u00e7far\u00eb b\u00ebhet fjal\u00eb, do t\u00eb tregoj pak rreth VWO. Kjo \u00ebsht\u00eb nj\u00eb platform\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. \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,","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}]}}