{"id":75530,"date":"2020-03-26T19:42:23","date_gmt":"2020-03-26T17:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/vyvod-rezultatov-poiska-i-problemy-s-proizvoditelnostyu"},"modified":"2020-03-26T19:42:23","modified_gmt":"2020-03-26T17:42:23","slug":"vyvod-rezultatov-poiska-i-problemy-s-proizvoditelnostyu","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vyvod-rezultatov-poiska-i-problemy-s-proizvoditelnostyu","title":{"rendered":"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nj\u00eb nga skenar\u00ebt tipik\u00eb n\u00eb t\u00eb gjitha aplikacionet q\u00eb njohim \u00ebsht\u00eb k\u00ebrkimi i t\u00eb dh\u00ebnave sipas kritereve t\u00eb caktuara dhe shfaqja e tyre n\u00eb nj\u00eb format t\u00eb leht\u00eb p\u00ebr t'u lexuar. K\u00ebtu mund t\u00eb jen\u00eb mund\u00ebsi shtes\u00eb p\u00ebr renditje, grupim dhe shfaqje me faqe. Detyra, n\u00eb parim, duket triviale, por gjat\u00eb zgjidhjes s\u00eb saj, shum\u00eb zhvillues b\u00ebjn\u00eb nj\u00eb s\u00ebr\u00eb gabimesh, t\u00eb cilat m\u00eb pas ndikon n\u00eb performanc\u00ebn. Le t\u00eb shqyrtojm\u00eb ndryshime t\u00eb ndryshme t\u00eb k\u00ebsaj detyre dhe t\u00eb formulojm\u00eb rekomandime p\u00ebr zgjedhjen e zgjidhjes m\u00eb efikase.<\/p>\n<p><img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/364ab29c4a6117ff441b933a38ec8401.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Opsioni i paging #1<\/h2>\n<p>\nOpsioni m\u00eb i thjesht\u00eb q\u00eb vjen n\u00eb mendje \u00ebsht\u00eb shfaqja me faqe e rezultateve t\u00eb k\u00ebrkimit n\u00eb form\u00ebn e tij m\u00eb klasike.<\/p>\n<p><img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/4957d9ad21a8a0c70390b224fe76cb33.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLe t\u00eb supozojm\u00eb se n\u00eb aplikacion p\u00ebrdoret nj\u00eb baz\u00eb t\u00eb dh\u00ebnash relacionale. N\u00eb k\u00ebt\u00eb rast, p\u00ebr t\u00eb shfaqur informacionin n\u00eb k\u00ebt\u00eb form\u00eb, do t\u00eb nevojiten dy k\u00ebrkesa SQL:<\/p>\n<ul>\n<li>Merrni rreshtat p\u00ebr faqen aktuale.<\/li>\n<li>Num\u00ebroni numrin total t\u00eb rreshtave q\u00eb i p\u00ebrgjigjen kritereve t\u00eb k\u00ebrkimit \u2014 kjo \u00ebsht\u00eb e nevojshme p\u00ebr t\u00eb treguar faqet.<\/li>\n<\/ul>\n<p>\nLe t\u00eb shqyrtojm\u00eb k\u00ebrkes\u00ebn e par\u00eb p\u00ebr shembull n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave testuese MS SQL <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Microsoft\/sql-server-samples\/releases\/download\/adventureworks\/AdventureWorks2016_EXT.bak\">AdventureWorks <\/a><\/noindex>p\u00ebr serverin 2016. P\u00ebr k\u00ebt\u00eb q\u00ebllim do t\u00eb p\u00ebrdorim tabel\u00ebn Sales.SalesOrderHeader:<\/p>\n<pre><code class=\"sql\">SELECT * FROM Sales.SalesOrderHeader\nORDER BY OrderDate DESC\nOFFSET 0 ROWS\nFETCH NEXT 50 ROWS ONLY\n<\/code><\/pre>\n<p>\nK\u00ebrkesa e sip\u00ebrme do t\u00eb nxjerr\u00eb 50 porosit\u00eb e para nga lista, t\u00eb renditura n\u00eb m\u00ebnyr\u00eb dekreskuese sipas dat\u00ebs s\u00eb shtimit, dometh\u00ebn\u00eb \u2014 50 porosit\u00eb e fundit.<\/p>\n<p>Ajo ekzekutohet shpejt n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave testuese, por le t\u00eb shikojm\u00eb planin e ekzekutimit dhe statistikat e hyrje-daljes:<\/p>\n<p><img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/248e4b64593c7000216b46777183d639.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">Tabela 'SalesOrderHeader'. Numri i skanimeve 1, lexime logjike 698, lexime fizike 0, lexime p\u00ebrpara 0, lexime logjike lob 0, lexime fizike lob 0, lexime p\u00ebrpara lob 0.<\/code><\/pre>\n<p>\n<i>Statistikat e hyrje-daljes p\u00ebr \u00e7do k\u00ebrkes\u00eb mund t\u00eb merren duke ekzekutuar n\u00eb mjedisin e ekzekutimit t\u00eb k\u00ebrkesave komand\u00ebn SET STATISTICS IO ON.<\/i><\/p>\n<p>Si\u00e7 duket nga plani i ekzekutimit, procesi m\u00eb frytshkurt \u00ebsht\u00eb renditja e t\u00eb gjith\u00eb rreshtave t\u00eb tabel\u00ebs origjinale sipas dat\u00ebs s\u00eb shtimit. Problemi \u00ebsht\u00eb se sa m\u00eb shum\u00eb rreshta t\u00eb shfaqen n\u00eb tabel\u00eb, aq m\u00eb 'e r\u00ebnd\u00eb' b\u00ebhet renditja. N\u00eb praktik\u00eb, situata t\u00eb tilla duhet t\u00eb shmangen, prandaj le t\u00eb shtojm\u00eb nj\u00eb indeks n\u00eb dat\u00ebn e shtimit dhe t\u00eb shohim n\u00ebse ka ndryshuar konsumi i burimeve:<\/p>\n<p><img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/a33e1eadf6f8f8b516b9bb834ad7ad86.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">Tabela 'SalesOrderHeader'. Numri i skanimeve 1, lexime logjike 165, lexime fizike 0, lexime p\u00ebrpara 5, lexime logjike lob 0, lexime fizike lob 0, lexime p\u00ebrpara lob 0.\n<\/code><\/pre>\n<p>\n\u00cbsht\u00eb e qart\u00eb se \u00ebsht\u00eb p\u00ebrmir\u00ebsuar ndjesh\u00ebm. Por a jan\u00eb zgjidhur t\u00eb gjitha problemet? Le t\u00eb ndryshojm\u00eb k\u00ebrkes\u00ebn p\u00ebr t\u00eb k\u00ebrkuar porosit\u00eb ku vlera e p\u00ebrgjithshme e produkteve kalon 100 dollar\u00eb:<\/p>\n<pre><code class=\"sql\">SELECT * FROM Sales.SalesOrderHeader\nWHERE SubTotal &gt; 100\nORDER BY OrderDate DESC\nOFFSET 0 ROWS\nFETCH NEXT 50 ROWS ONLY\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/e057bfc89e11a31c6d2855b93ec3c747.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">Tabela 'SalesOrderHeader'. Numri i skanimeve 1, lexime logjike 1081, lexime fizike 0, lexime p\u00ebrpara 0, lexime logjike lob 0, lexime fizike lob 0, lexime p\u00ebrpara lob 0.<\/code><\/pre>\n<p>\nKemi nj\u00eb situat\u00eb interesante: plani i k\u00ebrkes\u00ebs nuk \u00ebsht\u00eb shum\u00eb m\u00eb i keq se ai i m\u00ebparshmi, por numri real i leximeve logjike \u00ebsht\u00eb pothuajse dy her\u00eb m\u00eb i lart\u00eb se gjat\u00eb skanimit t\u00eb plote t\u00eb tabel\u00ebs. Ka nj\u00eb zgjidhje \u2014 n\u00ebse krijojm\u00eb nj\u00eb indeks t\u00eb p\u00ebrb\u00ebr\u00eb dhe t\u00eb shtojm\u00eb si fush\u00eb t\u00eb dyt\u00eb \u00e7mimin total t\u00eb produkteve, p\u00ebrs\u00ebri do t\u00eb kemi 165 lexime logjike:<\/p>\n<pre><code class=\"sql\">CREATE INDEX IX_SalesOrderHeader_OrderDate_SubTotal on Sales.SalesOrderHeader(OrderDate, SubTotal);\n<\/code><\/pre>\n<p>\nKjo seri shembujsh mund t\u00eb vazhdoj\u00eb p\u00ebr nj\u00eb koh\u00eb t\u00eb gjat\u00eb, por dy mendimet kryesore q\u00eb dua t\u00eb shpreh k\u00ebtu jan\u00eb:<\/p>\n<ul>\n<li>Shtimi i \u00e7do kriteri t\u00eb ri apo renditjeje n\u00eb k\u00ebrkes\u00ebn e k\u00ebrkimit mund t\u00eb ndikoj\u00eb ndjesh\u00ebm n\u00eb shpejt\u00ebsin\u00eb e ekzekutimit t\u00eb saj.<\/li>\n<li>Por n\u00ebse na nevojitet t\u00eb nxjerrim vet\u00ebm nj\u00eb pjes\u00eb t\u00eb t\u00eb dh\u00ebnave, dhe jo t\u00eb gjith\u00eb rezultatet q\u00eb p\u00ebrputhen me kriteret e k\u00ebrkimit \u2014 ka shum\u00eb m\u00ebnyra p\u00ebr t\u00eb optimizuar nj\u00eb k\u00ebrkes\u00eb t\u00eb till\u00eb.<\/li>\n<\/ul>\n<p>\nTani le t\u00eb kalojm\u00eb n\u00eb k\u00ebrkes\u00ebn e dyt\u00eb, t\u00eb p\u00ebrmendur n\u00eb fillim \u2014 at\u00eb q\u00eb num\u00ebron rekordet q\u00eb p\u00ebrmbushin kriterin e k\u00ebrkimit. T\u00eb marrim t\u00eb nj\u00ebjtin shembull \u2014 k\u00ebrkimin e porosive q\u00eb kalojn\u00eb 100 dollar\u00eb:<\/p>\n<pre><code class=\"sql\">SELECT COUNT(1) FROM Sales.SalesOrderHeader\nWHERE SubTotal &gt; 100\n<\/code><\/pre>\n<p>\nMe nj\u00eb indeks t\u00eb p\u00ebrb\u00ebr\u00eb, si\u00e7 u p\u00ebrmend m\u00eb sip\u00ebr, marrim:<\/p>\n<p><img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/7beab0c83a50e2d68a83a965df555ec9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">Tabela 'SalesOrderHeader'. Numri i skanimeve 1, lexime logjike 698, lexime fizike 0, lexime p\u00ebrpara 0, lexime logjike lob 0, lexime fizike lob 0, lexime p\u00ebrpara lob 0.<\/code><\/pre>\n<p>\nQ\u00eb k\u00ebrkesa kalon t\u00eb gjith\u00eb indeksin nuk \u00ebsht\u00eb \u00e7udi, pasi fusha SubTotal nuk \u00ebsht\u00eb n\u00eb pozita t\u00eb para, prandaj k\u00ebrkesa nuk mund ta shfryt\u00ebzoj\u00eb at\u00eb. Problemi zgjidhet duke shtuar nj\u00eb indeks tjet\u00ebr n\u00eb fush\u00ebn SubTotal, dhe n\u00eb fund jep vet\u00ebm 48 lexime logjike.<\/p>\n<p>Mund t\u00eb jepen edhe disa shembuj t\u00eb tjer\u00eb t\u00eb k\u00ebrkesave p\u00ebr num\u00ebrimin e sasis\u00eb, por thelbi do t\u00eb mbetet i nj\u00ebjt\u00eb: <b>p\u00ebrftimi i nj\u00eb sasie t\u00eb dh\u00ebnash dhe num\u00ebrimi i numrit total \u00ebsht\u00eb dy k\u00ebrkesa esencialisht t\u00eb ndryshme<\/b>, dhe secila k\u00ebrkon masat e saj p\u00ebr optimizim. N\u00eb p\u00ebrgjith\u00ebsi, nuk do t\u00eb mund t\u00eb gjejm\u00eb nj\u00eb kombinim indeksesh q\u00eb funksionon po nj\u00ebsoj mir\u00eb p\u00ebr t\u00eb dy k\u00ebrkesat.<\/p>\n<p>Prandaj, nj\u00eb nga k\u00ebrkesat e r\u00ebnd\u00ebsishme q\u00eb duhet sqaruar gjat\u00eb zhvillimit t\u00eb nj\u00eb zgjidhjeje t\u00eb till\u00eb k\u00ebrkimi \u00ebsht\u00eb n\u00ebse n\u00eb t\u00eb v\u00ebrtet\u00eb biznesi ka r\u00ebnd\u00ebsi p\u00ebr t\u00eb par\u00eb numrin e p\u00ebrgjithsh\u00ebm t\u00eb objekteve t\u00eb gjetura. Shpesh ndodh q\u00eb jo. Dhe navigimi p\u00ebr numra t\u00eb caktuar faqesh, sipas mendimit tim, \u00ebsht\u00eb nj\u00eb zgjidhje me nj\u00eb aplikacion shum\u00eb t\u00eb ngusht\u00eb, pasi shumica e skenar\u00ebve me paginim duket si \"kalim n\u00eb faqen tjet\u00ebr\".<\/p>\n<h2>Opcioni i paginimit #2<\/h2>\n<p>\nSupozoni q\u00eb p\u00ebrdoruesve nuk u intereson njohja e numrit t\u00eb p\u00ebrgjithsh\u00ebm t\u00eb objekteve t\u00eb gjetura. Le t\u00eb p\u00ebrpiqemi ta thjeshtojm\u00eb faqen e k\u00ebrkimit:<\/p>\n<p><img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/66f5ee6dc1a52f14e55ae31e05c502b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00eb fakt, vet\u00ebm ka ndryshuar se nuk ka mund\u00ebsi t\u00eb kalosh n\u00eb numra t\u00eb caktuar faqesh, dhe tani kjo tabel\u00eb p\u00ebr shfaqje nuk ka nevoj\u00eb t\u00eb dij\u00eb se sa t\u00eb gjitha mund t\u00eb jen\u00eb. Por lind nj\u00eb pyetje \u2014 si do ta dij\u00eb tabela n\u00ebse ka t\u00eb dh\u00ebna p\u00ebr faqen tjet\u00ebr (p\u00ebr t\u00eb shfaqur sakt\u00eb lidhjen \"Tjet\u00ebr\")?<\/p>\n<p>P\u00ebrgjigja \u00ebsht\u00eb shum\u00eb e thjesht\u00eb: mund t\u00eb lexosh nga baza nj\u00eb regjist\u00ebr m\u00eb shum\u00eb se sa nevojitet p\u00ebr shfaqje, dhe prania e k\u00ebtij regjistri \"shtes\u00eb\" do t\u00eb tregohet p\u00ebr t\u00eb treguar n\u00ebse ka nj\u00eb grup tjet\u00ebr. K\u00ebshtu, p\u00ebr t\u00eb marr\u00eb nj\u00eb faqe t\u00eb dh\u00ebnash do t\u00eb duhet t\u00eb ekzekutosh vet\u00ebm nj\u00eb k\u00ebrkes\u00eb, e cila ndjesh\u00ebm p\u00ebrmir\u00ebson performanc\u00ebn dhe leht\u00ebson mb\u00ebshtetje t\u00eb till\u00eb t\u00eb funksionalitetit. Kam pasur n\u00eb praktik\u00eb rastin kur heqja dor\u00eb nga num\u00ebrimi i p\u00ebrgjithsh\u00ebm t\u00eb regjistrave e ka p\u00ebrshpejtuar sjelljen e rezultateve me 4-5 her\u00eb.<\/p>\n<p>P\u00ebr k\u00ebt\u00eb qasje ekzistojn\u00eb disa variante t\u00eb nd\u00ebrfaqes s\u00eb p\u00ebrdoruesit: komandat \"mbrapa\" dhe \"p\u00ebrpara\", si\u00e7 \u00ebsht\u00eb shembulli m\u00eb sip\u00ebr, butoni \"ngarko m\u00eb shum\u00eb\", i cili thjesht shton nj\u00eb grup t\u00eb ri n\u00eb rezultatet e shfaqura, \"rrotullim i pafund\", i cili funksionon sipas parimit \"ngarko m\u00eb shum\u00eb\", por sinjali p\u00ebr marrjen e grupit tjet\u00ebr \u00ebsht\u00eb ngjitja nga p\u00ebrdoruesi n\u00eb fund t\u00eb t\u00eb gjitha rezultateve t\u00eb shfaqura. Si do t\u00eb ishte zgjidhja vizuale, parimi i seleksionimit t\u00eb t\u00eb dh\u00ebnave mbetet i nj\u00ebjt\u00eb.<\/p>\n<h2>Nuancat n\u00eb realizimin e paginimit<\/h2>\n<p>\nN\u00eb t\u00eb gjith\u00eb shembujt e k\u00ebrkesave t\u00eb dh\u00ebna m\u00eb lart, p\u00ebrdoret qasja \"zhvendosje + numri\", kur n\u00eb vet\u00eb k\u00ebrkes\u00ebn tregohet nga cila rresht i rezultatit dhe sa rreshta duhet t\u00eb kthehen. S\u00eb pari, le t\u00eb shohim se si \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb organizohet kalimi i parametrave n\u00eb k\u00ebt\u00eb rast. N\u00eb praktik\u00eb kam hasur disa m\u00ebnyra:<\/p>\n<ul>\n<li>Numri rendor i faqes s\u00eb k\u00ebrkuar (pageIndex), madh\u00ebsia e faqes (pageSize).<\/li>\n<li>Numri rendor i regjistrit t\u00eb par\u00eb q\u00eb duhet t\u00eb kthehet (startIndex), numri maksimal i regjistrave n\u00eb rezultat (count).<\/li>\n<li>Numri rendor i regjistrit t\u00eb par\u00eb q\u00eb duhet t\u00eb kthehet (startIndex), numri rendor i regjistrit t\u00eb fundit q\u00eb duhet t\u00eb kthehet (endIndex).<\/li>\n<\/ul>\n<p>\nN\u00eb dukje mund t\u00eb duket se \u00ebsht\u00eb kaq elementar, sa nuk ka ndonj\u00eb diferenc\u00eb. Por nuk \u00ebsht\u00eb k\u00ebshtu \u2014 opsioni m\u00eb i p\u00ebrshtatsh\u00ebm dhe universalisht \u00ebsht\u00eb i dyti (startIndex, count). Kjo ka disa arsye:<\/p>\n<ul>\n<li>P\u00ebr qasjen me leximin +1 t\u00eb regjistrave, e cila p\u00ebrmendet m\u00eb lart, varianti i par\u00eb me pageIndex dhe pageSize \u00ebsht\u00eb shum\u00eb i pak\u00ebndsh\u00ebm. P\u00ebr shembull, ne duam t\u00eb shfaqim 50 regjistra n\u00eb faqe. Sipas algoritmit t\u00eb p\u00ebrmendur m\u00eb sip\u00ebr, duhet t\u00eb lexojm\u00eb nj\u00eb regjist\u00ebr m\u00eb shum\u00eb se sa duhet. N\u00ebse ky \"+1\" nuk \u00ebsht\u00eb parashikuar n\u00eb server, rezulton se p\u00ebr faqen e par\u00eb duhet t\u00eb k\u00ebrkojm\u00eb regjistra nga 1 n\u00eb 51, p\u00ebr t\u00eb dyt\u00ebn \u2014 nga 51 n\u00eb 101 etj. N\u00ebse p\u00ebrcaktojm\u00eb madh\u00ebsin\u00eb e faqes 51 dhe rritim pageIndex, faqja e dyt\u00eb do t\u00eb kthej\u00eb nga 52 n\u00eb 102 etj. Prandaj, n\u00eb variantin e par\u00eb, m\u00ebnyra e vetme p\u00ebr t\u00eb realizuar normalisht butonin e kalimit n\u00eb faqen tjet\u00ebr \u00ebsht\u00eb t\u00eb parashikojm\u00eb n\u00eb server leximin e \"regjistrit t\u00eb tep\u00ebrt\", q\u00eb do t\u00eb ishte nj\u00eb nuanc\u00eb shum\u00eb e paqart\u00eb.<\/li>\n<li>Varianti i tret\u00eb nuk ka absolutisht kuptim, pasi p\u00ebr ekzekutimin e k\u00ebrkesave n\u00eb shumic\u00ebn e bazave t\u00eb t\u00eb dh\u00ebnave s\u00eb bashku duhet t\u00eb kalosh sasin\u00eb dhe jo indeksin e regjistrit t\u00eb fundit. Le t\u00eb jet\u00eb heqja e startIndex nga endIndex dhe nj\u00eb operacion themelor aritmetik, por \u00ebsht\u00eb e panevojshme k\u00ebtu.<\/li>\n<\/ul>\n<p>\nTani duhet t\u00eb p\u00ebrshkruajm\u00eb disavantazhet e realizimit t\u00eb paginimit p\u00ebrmes \"zhvendosjes + numrit\":<\/p>\n<ul>\n<li>Marrja e \u00e7do faqe tjet\u00ebr do t\u00eb jet\u00eb m\u00eb e kushtueshme dhe m\u00eb e ngadalt\u00eb se e m\u00ebparshmja, pasi baza e t\u00eb dh\u00ebnave ende do t\u00eb duhet t\u00eb kaloj\u00eb p\u00ebrmes t\u00eb gjitha regjistrave nga \"fillimi\" sipas kritereve t\u00eb k\u00ebrkimit dhe renditjes, pas s\u00eb cil\u00ebs do t\u00eb ndaloj\u00eb n\u00eb fragmentin e nevojsh\u00ebm.<\/li>\n<li>Jo t\u00eb gjitha DBMS mund ta mb\u00ebshtesin k\u00ebt\u00eb qasje.<\/li>\n<\/ul>\n<p>\nEkzistojn\u00eb alternativa, por ato gjithashtu nuk jan\u00eb ideale. I pari nga k\u00ebto qasje quhet \"keyset paging\" ose \"seek method\" dhe p\u00ebrb\u00ebhet nga kjo: pas marrjes s\u00eb nj\u00eb grupi mund t\u00eb mbani mend vlerat e fushave n\u00eb regjistrin e fundit n\u00eb faqe, dhe m\u00eb pas t'i p\u00ebrdorni ato p\u00ebr t\u00eb marr\u00eb grupin tjet\u00ebr. P\u00ebr shembull, ne kemi ekzekutuar nj\u00eb t\u00eb till\u00eb k\u00ebrkes\u00eb:<\/p>\n<pre><code class=\"sql\">SELECT * FROM Sales.SalesOrderHeader\nORDER BY OrderDate DESC\nOFFSET 0 ROWS\nFETCH NEXT 50 ROWS ONLY\n<\/code><\/pre>\n<p>\n\u0418 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b \u0437\u0430\u043a\u0430\u0437\u0430 &#8216;2014-06-29&#8217;. \u0422\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"sql\">SELECT * FROM Sales.SalesOrderHeader\nWHERE OrderDate &lt; &#039;2014-06-29&#039;\nORDER BY OrderDate DESC\nOFFSET 0 ROWS\nFETCH NEXT 50 ROWS ONLY\n<\/code><\/pre>\n<p>\nProblemi \u00ebsht\u00eb se OrderDate \u00ebsht\u00eb nj\u00eb fush\u00eb jo unike dhe kushti i p\u00ebrmendur m\u00eb sip\u00ebr me shum\u00eb gjasa do t\u00eb shp\u00ebrfill\u00eb shum\u00eb rreshta t\u00eb nevojsh\u00ebm. P\u00ebr t\u00eb sjell\u00eb qart\u00ebsi n\u00eb k\u00ebt\u00eb k\u00ebrkes\u00eb, duhet t\u00eb shtojm\u00eb n\u00eb kusht nj\u00eb fush\u00eb unike (le t\u00eb supozojm\u00eb q\u00eb 75074 \u00ebsht\u00eb vlera e fundit e \u00e7el\u00ebsit primar nga grupi i par\u00eb):<\/p>\n<pre><code class=\"sql\">SELECT * FROM Sales.SalesOrderHeader\nWHERE (OrderDate = '2014-06-29' AND SalesOrderID &lt; 75074)\n   OR (OrderDate &lt; &#039;2014-06-29&#039;)\nORDER BY OrderDate DESC, SalesOrderID DESC\nOFFSET 0 ROWS\nFETCH NEXT 50 ROWS ONLY\n<\/code><\/pre>\n<p>\n\u042d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u044f\u0436\u0435\u043b\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 OR. \u0415\u0441\u043b\u0438 \u0441 \u0440\u043e\u0441\u0442\u043e\u043c OrderDate \u0440\u0430\u0441\u0442\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e SalesOrderID. \u041d\u043e \u0435\u0441\u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0438 \u043f\u043e\u043b\u044f, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043d\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0438 \u2014 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0421\u0423\u0411\u0414 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e OR \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u043c\u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f PostgreSQL, \u0433\u0434\u0435 \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439, \u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u00abWHERE (OrderDate, SalesOrderID) &lt; (&#8216;2014-06-29&#8217;, 75074)\u00bb. \u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0441 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u043b\u044f\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0435\u0433\u043a\u0438\u043c.<\/p>\n<p>Nj\u00eb qasje alternative e dyt\u00eb mund t\u00eb haset, p\u00ebr shembull, n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/6.8\/search-request-scroll.html\">ElasticSearch scroll API<\/a><\/noindex> ose <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@gary.strange\/understanding-cosmosdb-continuation-tokens-hasmoreresults-and-connectionpolicy-requesttimeouts-3ed1fadfa81d\">Cosmos DB<\/a><\/noindex> \u2014 kur k\u00ebrkesa p\u00ebrve\u00e7 t\u00eb dh\u00ebnave kthen nj\u00eb identifikues special, me t\u00eb cilin mund t\u00eb marr\u00ebsh grupin e ardhsh\u00ebm t\u00eb t\u00eb dh\u00ebnave. N\u00ebse ky identifikues ka nj\u00eb afat t\u00eb pakufizuar (si n\u00eb Comsos DB), at\u00ebher\u00eb kjo \u00ebsht\u00eb nj\u00eb m\u00ebnyr\u00eb e shk\u00eblqyer p\u00ebr t\u00eb zbatuar paging me kalimin sekondar mes faqeve (varianti #2 i p\u00ebrmendur m\u00eb lart). Disavantazhet e mundshme: mb\u00ebshtetet shum\u00eb pak nga t\u00eb gjitha DBMS-t\u00eb; identifikuesi i marr\u00eb p\u00ebr grupin e ardhsh\u00ebm mund t\u00eb ket\u00eb nj\u00eb afat t\u00eb kufizuar, q\u00eb n\u00eb p\u00ebrgjith\u00ebsi nuk \u00ebsht\u00eb i p\u00ebrshtatsh\u00ebm p\u00ebr realizimin e nd\u00ebrveprimit me p\u00ebrdoruesin (si, p\u00ebr shembull, ElasticSearch scroll API).<\/p>\n<h2>Filtrimi i komplikuar<\/h2>\n<p>\nPo e v\u00ebshtir\u00ebsojm\u00eb m\u00eb tej detyr\u00ebn. Supozoni se ka nj\u00eb k\u00ebrkes\u00eb p\u00ebr t\u00eb realizuar at\u00eb q\u00eb quhet k\u00ebrkesa faceted, e njohur mir\u00eb nga dyqanet Online. Shembujt e m\u00ebsip\u00ebrm mbi tabel\u00ebn e porosive nuk jan\u00eb shum\u00eb ilustrues n\u00eb k\u00ebt\u00eb rast, prandaj do t\u00eb kalojm\u00eb n\u00eb tabel\u00ebn Product nga baza AdventureWorks:<\/p>\n<p><img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/070890a3cb79de3edc69b60b5300efe7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c7far\u00eb \u00ebsht\u00eb ideja e k\u00ebrkimit faceted? \u00cbsht\u00eb, q\u00eb p\u00ebr \u00e7do element filtri t\u00eb tregohet numri i regjistrimeve q\u00eb p\u00ebrputhen me k\u00ebt\u00eb kriter <i>me p\u00ebrjashtim t\u00eb filtrave t\u00eb zgjedhur n\u00eb t\u00eb gjitha kategorit\u00eb e tjera<\/i>.<\/p>\n<p>P\u00ebr shembull, n\u00ebse n\u00eb k\u00ebt\u00eb shembull zgjedhim kategorin\u00eb Bikes dhe ngjyr\u00ebn Black, tabela do t\u00eb tregohet vet\u00ebm bi\u00e7ikleta n\u00eb ngjyr\u00eb t\u00eb zez\u00eb, por p\u00ebr k\u00ebt\u00eb:<\/p>\n<ul>\n<li>P\u00ebr \u00e7do kriter t\u00eb grupit \"Categories\" do t\u00eb tregohen numri i produkteve nga kjo kategori q\u00eb jan\u00eb n\u00eb ngjyr\u00ebn e zez\u00eb.<\/li>\n<li>P\u00ebr \u00e7do kriter t\u00eb grupit \"Colors\" do t\u00eb tregohet numri i bi\u00e7ikletave n\u00eb k\u00ebt\u00eb ngjyr\u00eb.<\/li>\n<\/ul>\n<p>\nJa nj\u00eb shembull i daljes s\u00eb rezultatit p\u00ebr k\u00ebto kushte:<\/p>\n<p><img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/7c8ec4d8b427f1f59f0129afebe74b08.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00ebse p\u00ebrve\u00e7 k\u00ebtij kategorizimi sh\u00ebnojm\u00eb kategorin\u00eb \"Clothing\", tabela do t\u00eb tregoj\u00eb gjithashtu edhe rrobat n\u00eb ngjyr\u00eb t\u00eb zez\u00eb q\u00eb jan\u00eb n\u00eb dispozicion. Numri i produkteve n\u00eb ngjyr\u00eb t\u00eb zez\u00eb n\u00eb seksionin \"Color\" gjithashtu do t\u00eb rikalkulohet sipas kushteve t\u00eb reja, vet\u00ebm n\u00eb seksionin \"Categories\" asgj\u00eb nuk do t\u00eb ndryshoj\u00eb... Shpresoj q\u00eb k\u00ebto shembuj jan\u00eb t\u00eb mjaftuesh\u00ebm p\u00ebr t\u00eb kuptuar algoritmin e zakonsh\u00ebm t\u00eb funksionimit t\u00eb k\u00ebrkimit faceted.<\/p>\n<p>Tani imagjinoni se si kjo mund t\u00eb realizohet n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash relacionale. \u00c7do grup kriteresh, si\u00e7 jan\u00eb Kategorit\u00eb dhe Ngjyra, do t\u00eb k\u00ebrkoj\u00eb nj\u00eb k\u00ebrkes\u00eb t\u00eb ve\u00e7ant\u00eb:<\/p>\n<pre><code class=\"sql\">SELECT pc.ProductCategoryID, pc.Name, COUNT(1) FROM Production.Product p\n  INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID\n  INNER JOIN Production.ProductCategory pc ON ps.ProductCategoryID = pc.ProductCategoryID\nWHERE p.Color = 'Black'\nGROUP BY pc.ProductCategoryID, pc.Name\nORDER BY COUNT(1) DESC\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/3b59b68ce934c4ec1630ec649e68ccdb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"sql\">SELECT Color, COUNT(1) FROM Production.Product p\n  INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID\nWHERE ps.ProductCategoryID = 1 --Bikes\nGROUP BY Color\nORDER BY COUNT(1) DESC\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn\" src=\"\/wp-content\/uploads\/2020\/03\/82e1e6ab0fae683d383e3fecf4e3a15a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c7far\u00eb nuk shkon me k\u00ebt\u00eb zgjidhje? Shum\u00eb thjesht \u2014 ajo nuk \u00ebsht\u00eb e shkall\u00ebzuar mir\u00eb. \u00c7do seksion filtri k\u00ebrkon nj\u00eb k\u00ebrkes\u00eb t\u00eb ve\u00e7ant\u00eb p\u00ebr num\u00ebrimin e sasive dhe k\u00ebto k\u00ebrkesa nuk jan\u00eb t\u00eb lehta. N\u00eb dyqanet online, n\u00eb disa kategori mund t\u00eb ket\u00eb edhe disa dhjet\u00ebra sekcione filtrimi, q\u00eb mund t\u00eb kursej\u00eb nj\u00eb problem serioz p\u00ebr performanc\u00ebn.<\/p>\n<p>Zakonsisht pas k\u00ebtyre pohimeve, m\u00eb ofrojn\u00eb disa zgjidhje, ndryshe:<\/p>\n<ul>\n<li>T\u00eb bashkohen t\u00eb gjitha num\u00ebrimet e sasive n\u00eb nj\u00eb k\u00ebrkes\u00eb. Teknikisht, kjo \u00ebsht\u00eb e mundur me ndihm\u00ebn e fjal\u00ebs ky\u00e7e UNION, por kjo nuk do ta ndihmoj\u00eb shum\u00eb n\u00eb performanc\u00eb \u2014 baza e t\u00eb dh\u00ebnave prap\u00eb do t\u00eb duhet t\u00eb kryej\u00eb \"nga fillimi\" \u00e7do nga fragmentet.<\/li>\n<li>Memorizimi i numrave. M\u00eb propozojn\u00eb k\u00ebt\u00eb pothuajse \u00e7do her\u00eb kur p\u00ebrshkruaj nj\u00eb problem. Problemi \u00ebsht\u00eb se kjo \u00ebsht\u00eb n\u00eb terma t\u00eb p\u00ebrgjithsh\u00ebm e pamundur. Le t\u00eb supozojm\u00eb se kemi 10 \"faset\", secila me 5 vlera. Kjo \u00ebsht\u00eb nj\u00eb situat\u00eb shum\u00eb \"modeste\" krahasuar me at\u00eb q\u00eb mund t\u00eb shihni n\u00eb dyqanet online. Zgjedhja e nj\u00eb elementi n\u00eb nj\u00eb faset ndikon n\u00eb numrat n\u00eb 9 t\u00eb tjer\u00eb; me fjal\u00eb t\u00eb tjera, p\u00ebr \u00e7do kombinim kriteresh, numrat mund t\u00eb jen\u00eb t\u00eb ndrysh\u00ebm. N\u00eb shembullin ton\u00eb, ka gjithsej 50 kritere q\u00eb p\u00ebrdoruesi mund t\u00eb zgjedh\u00eb, k\u00ebshtu q\u00eb do t\u00eb ket\u00eb 250 kombinime t\u00eb mundshme. Nuk ka mjaftuesh\u00ebm memorie dhe koh\u00eb p\u00ebr t\u00eb mbushur nj\u00eb t\u00eb till\u00eb mas\u00eb t\u00eb dh\u00ebnash. T\u00eb tjer\u00ebt mund t\u00eb argumentojn\u00eb se jo t\u00eb gjitha kombinimet jan\u00eb reale dhe p\u00ebrdoruesi shpesh nuk zgjedh m\u00eb shum\u00eb se 5-10 kritere. Po, mund t\u00eb implementoni ngarkim t\u00eb ngadalsh\u00ebm dhe memorizim t\u00eb numrave vet\u00ebm p\u00ebr ato q\u00eb jan\u00eb zgjedhur ndonj\u00ebher\u00eb, por sa m\u00eb shum\u00eb mund\u00ebsi zgjedhjeje t\u00eb ket\u00eb, aq m\u00eb pak efikase do t\u00eb jet\u00eb kjo memorje dhe aq m\u00eb t\u00eb dukshme do t\u00eb jen\u00eb problemet me koh\u00ebn e p\u00ebrgjigjes (sidomos n\u00ebse grumbulli i t\u00eb dh\u00ebnave ndryshon rregullisht).<\/li>\n<\/ul>\n<p>\nFatmir\u00ebsisht, nj\u00eb problem i till\u00eb ka zgjidhje t\u00eb mjaftueshme efektive q\u00eb funksionojn\u00eb parashikuesh\u00ebm me sasi t\u00eb m\u00ebdha t\u00eb dh\u00ebnash. P\u00ebr \u00e7do nj\u00eb nga k\u00ebto opsione ka kuptim t\u00eb ndahen rinovimi i faset\u00ebve dhe marrja e faqes s\u00eb rezultateve n\u00eb dy k\u00ebrkesa paralele ndaj serverit dhe t\u00eb organizohet nd\u00ebrfaqja e p\u00ebrdoruesit n\u00eb nj\u00eb m\u00ebnyr\u00eb q\u00eb ngarkimi i t\u00eb dh\u00ebnave mbi faset\u00ebt \"nuk pengon\" shfaqjen e rezultateve t\u00eb k\u00ebrkimit.<\/p>\n<ul>\n<li>Thirrni rinovimin e plot\u00eb t\u00eb \"faset\u00ebve\" sa m\u00eb rrall\u00eb q\u00eb t\u00eb jet\u00eb e mundur. P.sh., mos e rinovoni gjith\u00e7ka me \u00e7do ndryshim t\u00eb kritereve t\u00eb k\u00ebrkimit, por n\u00eb vend t\u00eb k\u00ebsaj, gjeni numrin total t\u00eb rezultateve q\u00eb p\u00ebrputhen me kushtet aktuale dhe ofroni p\u00ebrdoruesit q\u00eb t'i shfaq\u00eb ato \u2014 \"1425 t\u00eb dh\u00ebna t\u00eb gjetura, t\u00eb shfaqim?\" P\u00ebrdoruesi mund t\u00eb vazhdoj\u00eb t\u00eb ndryshoj\u00eb kushtet e k\u00ebrkimit ose t\u00eb klikoj\u00eb butonin \"shfaqim\". Vet\u00ebm n\u00eb rastin e dyt\u00eb do t\u00eb kryhen t\u00eb gjitha k\u00ebrkesat p\u00ebr marrjen e rezultateve dhe rinovimin e numrave n\u00eb t\u00eb gjitha \"faset\u00ebt\". N\u00eb k\u00ebt\u00eb rast, si\u00e7 \u00ebsht\u00eb e dukshme, do t\u00eb duhet t\u00eb merren n\u00eb konsiderat\u00eb k\u00ebrkesat p\u00ebr t\u00eb marr\u00eb numrin total t\u00eb rezultateve dhe optimizimin e tij. Ky metod mund t\u00eb shihet n\u00eb shum\u00eb dyqane t\u00eb vogla online. \u00cbsht\u00eb e qart\u00eb se kjo nuk \u00ebsht\u00eb nj\u00eb zgjidhje p\u00ebr problemin, por n\u00eb raste t\u00eb thjeshta mund t\u00eb jet\u00eb nj\u00eb kompromis i mir\u00eb.<\/li>\n<li>P\u00ebrdorni motor\u00eb k\u00ebrkimi p\u00ebr t\u00eb gjetur rezultate dhe num\u00ebruar faset\u00ebt, si Solr, ElasticSearch, Sphinx dhe t\u00eb tjer\u00eb. T\u00eb gjith\u00eb ata jan\u00eb t\u00eb dizajnuar p\u00ebr nd\u00ebrtimin e \"faset\u00ebve\" dhe e b\u00ebjn\u00eb k\u00ebt\u00eb mjaft efektivisht duke p\u00ebrdorur indeksin e inverzuar. Si funksionojn\u00eb motor\u00ebt e k\u00ebrkimit, pse jan\u00eb m\u00eb efektiv\u00eb n\u00eb k\u00ebto raste krahasuar me bazat e t\u00eb dh\u00ebnave t\u00eb zakonshme, \u00e7far\u00eb praktikash dhe pengesash ekzistojn\u00eb \u2014 kjo \u00ebsht\u00eb nj\u00eb tem\u00eb p\u00ebr nj\u00eb artikull t\u00eb ve\u00e7ant\u00eb. K\u00ebtu dua t\u00eb theksoj q\u00eb motor\u00ebt e k\u00ebrkimit nuk mund t\u00eb z\u00ebvend\u00ebsojn\u00eb depozit\u00ebn kryesore t\u00eb t\u00eb dh\u00ebnave; p\u00ebrdoren si nj\u00eb p\u00ebrforcim: \u00e7do ndryshim n\u00eb baz\u00ebn kryesore, i cili ka r\u00ebnd\u00ebsi p\u00ebr k\u00ebrkimin, sinkronizohet n\u00eb indeksin e k\u00ebrkimit; mekanizmi i k\u00ebrkimit ndikon zakonisht vet\u00ebm me motorin e k\u00ebrkimit dhe nuk iu drejtohet baz\u00ebs kryesore. Nj\u00eb nga piketat m\u00eb t\u00eb r\u00ebnd\u00ebsishme k\u00ebtu \u00ebsht\u00eb se si ta organizoni k\u00ebt\u00eb sinkronizim n\u00eb nj\u00eb m\u00ebnyr\u00eb t\u00eb sigurt. Gjith\u00e7ka varet nga k\u00ebrkesat p\u00ebr \"koh\u00ebn e reagimit\". N\u00ebse koha mes ndryshimit n\u00eb baz\u00ebn kryesore dhe \"manifestimit\" t\u00eb tij n\u00eb k\u00ebrkim nuk \u00ebsht\u00eb kritike, mund t\u00eb krijoni nj\u00eb sh\u00ebrbim q\u00eb \u00e7do disa minuta k\u00ebrkon regjistrimet e ndryshuara s\u00eb fundi dhe i indeksin ato. N\u00ebse k\u00ebrkohet koha m\u00eb e ul\u00ebt e mundshme e reagimit, mund t\u00eb implementoni di\u00e7ka si <noindex><a rel=\"nofollow\" href=\"https:\/\/microservices.io\/patterns\/data\/transactional-outbox.html\">skema e kutis\u00eb transaksionale<\/a><\/noindex> p\u00ebr t\u00eb d\u00ebrguar p\u00ebrdit\u00ebsime n\u00eb sh\u00ebrbimin e k\u00ebrkimit.<\/li>\n<\/ul>\n<p><\/p>\n<h2>P\u00ebrfundimet<\/h2>\n<p><\/p>\n<ol>\n<li>Implementimi i paginimit n\u00eb an\u00ebn e serverit \u00ebsht\u00eb nj\u00eb nd\u00ebrlikim i r\u00ebnd\u00ebsish\u00ebm dhe ka kuptim ta aplikoni vet\u00ebm p\u00ebr grumbuj t\u00eb dh\u00ebnash q\u00eb rriten shpejt ose thjesht jan\u00eb t\u00eb m\u00ebdhenj. Si ta vler\u00ebsoni nj\u00eb \"t\u00eb madh\" ose \"t\u00eb shpejt\u00eb\" \u2014 nuk ka nj\u00eb recet\u00eb t\u00eb sakt\u00eb, por do t\u00eb ndiqja k\u00ebt\u00eb qasje:\n<ul>\n<li>N\u00ebse marrja e koleksionit t\u00eb plot\u00eb t\u00eb t\u00eb dh\u00ebnave, duke marr\u00eb parasysh koh\u00ebn e serverit dhe transmetimin n\u00ebp\u00ebr rrjet, p\u00ebrshtatet normalisht me k\u00ebrkesat p\u00ebr performanc\u00ebn \u2014 nuk ka kuptim t\u00eb implementoni paginimin n\u00eb an\u00ebn e serverit.<\/li>\n<li>Mund t\u00eb ndodh\u00eb nj\u00eb situat\u00eb ku n\u00eb nj\u00eb t\u00eb ardhme t\u00eb af\u00ebrt nuk parashikohen probleme me performanc\u00ebn, pasi t\u00eb dh\u00ebnat jan\u00eb t\u00eb pakta, por koleksioni i t\u00eb dh\u00ebnave \u00ebsht\u00eb gjithnj\u00eb n\u00eb rritje. N\u00ebse ndonj\u00eb grup t\u00eb dh\u00ebnash n\u00eb perspektiv\u00eb mund t\u00eb ndaloj\u00eb p\u00ebrmbushjen e pik\u00ebs s\u00eb m\u00ebparshme \u2014 \u00ebsht\u00eb m\u00eb mir\u00eb ta planifikoni paginimin nga fillimi.<\/li>\n<\/ul>\n<\/li>\n<li>N\u00ebse nga ana e biznesit nuk ka nj\u00eb k\u00ebrkes\u00eb strikte p\u00ebr shfaqjen e numrit total t\u00eb rezultateve ose p\u00ebr shfaqjen e numrave t\u00eb faqeve, dhe p\u00ebr m\u00eb tep\u00ebr n\u00eb sistemin tuaj nuk ka motor k\u00ebrkimi \u2014 \u00ebsht\u00eb m\u00eb mir\u00eb q\u00eb k\u00ebto pika t\u00eb mos implementohen dhe t\u00eb shqyrtohet opsioni #2.<\/li>\n<li>N\u00ebse ka nj\u00eb k\u00ebrkes\u00eb t\u00eb qart\u00eb p\u00ebr k\u00ebrkimin me faceta, keni dy mund\u00ebsi p\u00ebr t\u00eb mos sakrifikuar performanc\u00ebn:\n<ul>\n<li>Mos e p\u00ebrllogaritni gjith\u00eb numrat p\u00ebr \u00e7do ndryshim t\u00eb kritereve t\u00eb k\u00ebrkimit.<\/li>\n<li>P\u00ebrdorni motor\u00eb k\u00ebrkimi si Solr, ElasticSearch, Sphinx dhe t\u00eb tjer\u00eb. Por duhet t\u00eb kuptoni se ai nuk mund t\u00eb z\u00ebvend\u00ebsoj\u00eb baz\u00ebn e t\u00eb dh\u00ebnave kryesore dhe duhet p\u00ebrdorur si nj\u00eb shtes\u00eb p\u00ebr depot kryesore p\u00ebr zgjidhjen e detyrave t\u00eb k\u00ebrkimit. <\/li>\n<\/ul>\n<\/li>\n<li>Po ashtu, n\u00eb rastin e k\u00ebrkimit me faceta, ka kuptim t\u00eb ndahen marrja e faqes s\u00eb rezultateve t\u00eb k\u00ebrkimit dhe num\u00ebrimi i sasis\u00eb n\u00eb dy k\u00ebrkesa paralele. Num\u00ebrimi i sasis\u00eb mund t\u00eb marr\u00eb m\u00eb shum\u00eb koh\u00eb se marrja e rezultateve, nd\u00ebrsa rezultatet jan\u00eb m\u00eb t\u00eb r\u00ebnd\u00ebsishme p\u00ebr p\u00ebrdoruesin.<\/li>\n<li>N\u00ebse po p\u00ebrdorni nj\u00eb baz\u00eb t\u00eb dh\u00ebnash SQL p\u00ebr k\u00ebrkimin, \u00e7do ndryshim t\u00eb kodit q\u00eb i p\u00ebrket k\u00ebsaj pjese duhet t\u00eb testohet mir\u00eb p\u00ebr performanc\u00ebn mbi volumet e dh\u00ebnash t\u00eb p\u00ebrshtatshme (duke tejkaluar volumin n\u00eb baz\u00ebn 'live'). Po ashtu, \u00ebsht\u00eb e d\u00ebshirueshme t\u00eb p\u00ebrdoret monitorimi i koh\u00ebs s\u00eb ekzekutimit t\u00eb k\u00ebrkesave n\u00eb t\u00eb gjitha instancat e baz\u00ebs, dhe sidomos n\u00eb at\u00eb 'live'. Edhe n\u00ebse n\u00eb faz\u00ebn e zhvillimit me planet e k\u00ebrkesave gjith\u00e7ka ishte mir\u00eb, me rritjen e volumit t\u00eb t\u00eb dh\u00ebnave situata mund t\u00eb ndryshoj\u00eb ndjesh\u00ebm.<\/li>\n<\/ol>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/epam_systems\/blog\/493438\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u2014 \u043f\u043e\u0438\u0441\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c \u0438 \u0432\u044b\u0432\u043e\u0434 \u0438\u0445 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435. \u0422\u0443\u0442 \u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435, \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0435, \u043f\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u0443. \u0417\u0430\u0434\u0430\u0447\u0430, \u043f\u043e \u0438\u0434\u0435\u0435, \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f, \u043d\u043e \u043f\u0440\u0438 \u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u0440\u044f\u0434 \u043e\u0448\u0438\u0431\u043e\u043a, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0442\u043e\u043c \u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":75531,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-75530","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041e\u0434\u0438\u043d \u0438\u0437 \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u2014 \u043f\u043e\u0438\u0441\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c \u0438 \u0432\u044b\u0432\u043e\u0434 \u0438\u0445 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vyvod-rezultatov-poiska-i-problemy-s-proizvoditelnostyu\" \/>\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\u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \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 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041e\u0434\u0438\u043d \u0438\u0437 \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u2014 \u043f\u043e\u0438\u0441\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c \u0438 \u0432\u044b\u0432\u043e\u0434 \u0438\u0445 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vyvod-rezultatov-poiska-i-problemy-s-proizvoditelnostyu\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-26T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-26T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Shfaqja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn | ProHoster","description":"\u041e\u0434\u0438\u043d \u0438\u0437 \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u2014 \u043f\u043e\u0438\u0441\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c \u0438 \u0432\u044b\u0432\u043e\u0434 \u0438\u0445 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vyvod-rezultatov-poiska-i-problemy-s-proizvoditelnostyu","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\u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \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 | ProHoster","og:description":"\u041e\u0434\u0438\u043d \u0438\u0437 \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u2014 \u043f\u043e\u0438\u0441\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c \u0438 \u0432\u044b\u0432\u043e\u0434 \u0438\u0445 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vyvod-rezultatov-poiska-i-problemy-s-proizvoditelnostyu","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-26T17:42:23+00:00","article:modified_time":"2020-03-26T17:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"75530","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:55:26","updated":"2022-10-02 02:12:16","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\/75530","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=75530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/75530\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/75531"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=75530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=75530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=75530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}