{"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 paraqitja e tyre n\u00eb nj\u00eb format t\u00eb leht\u00eb p\u00ebr t'u lexuar. K\u00ebtu mund t\u00eb ket\u00eb mund\u00ebsi shtes\u00eb p\u00ebr renditje, grupim dhe shfaqje t\u00eb faqeve. Detyra, n\u00eb parim, \u00ebsht\u00eb triviale, por gjat\u00eb zgjidhjes s\u00eb saj shum\u00eb zhvillues b\u00ebjn\u00eb nj\u00eb s\u00ebr\u00eb gabimesh, p\u00ebr shkak t\u00eb t\u00eb cilave vuajn\u00eb m\u00eb pas performanc\u00ebn. Le t\u00eb shqyrtojm\u00eb variantet e ndryshme t\u00eb zgjidhjes s\u00eb k\u00ebsaj detyre dhe t\u00eb formulojm\u00eb rekomandime p\u00ebr zgjedhjen e implementimit m\u00eb efikas.<\/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>Varianti i faqeve #1<\/h2>\n<p>\nVarianti m\u00eb i thjesht\u00eb q\u00eb vjen n\u00eb mendje \u00ebsht\u00eb shfaqja e rezultateve t\u00eb k\u00ebrkimit n\u00eb m\u00ebnyr\u00ebn e saj 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 \/>\nSupozoni se aplikacioni p\u00ebrdor nj\u00eb databaz\u00eb relacionale. N\u00eb k\u00ebt\u00eb rast, p\u00ebr t\u00eb shfaqur informacionin n\u00eb nj\u00eb format t\u00eb till\u00eb, do t\u00eb nevojitet t\u00eb kryhen 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 p\u00ebrputhen me kriteret e k\u00ebrkimit \u2014 ky informacion \u00ebsht\u00eb i nevojsh\u00ebm p\u00ebr t\u00eb treguar faqet.<\/li>\n<\/ul>\n<p>\nLe t\u00eb shqyrtojm\u00eb k\u00ebrkes\u00ebn e par\u00eb n\u00eb shembullin e databaz\u00ebs 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 m\u00ebsip\u00ebrme do t\u00eb nxjerr\u00eb 50 porosit\u00eb e para nga lista, t\u00eb renditura sipas dat\u00ebs s\u00eb shtimit, me fjal\u00eb t\u00eb tjera \u2014 50 porosit\u00eb e fundit.<\/p>\n<p>Ajo ekzekutohet shpejt n\u00eb databaz\u00ebn testuese, por le t\u00eb shohim planin e ekzekutimit dhe statistikat e input-it dhe output-it:<\/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 paraprakisht t\u00eb lexuara 0, lexime logjike t\u00eb lobit 0, lexime fizike t\u00eb lobit 0, lexime paraprakisht t\u00eb lobit 0.<\/code><\/pre>\n<p>\n<i>Statistikat e input-it\/output-it p\u00ebr \u00e7do k\u00ebrkes\u00eb mund t\u00eb merren duke ekzekutuar n\u00eb ambientin e ekzekutimit t\u00eb k\u00ebrkesave komand\u00ebn SET STATISTICS IO ON.<\/i><\/p>\n<p>Si\u00e7 shihet nga plani i ekzekutimit, m\u00eb e konsumueshme p\u00ebr burime \u00ebsht\u00eb renditja e t\u00eb gjitha rreshtave t\u00eb tabel\u00ebs fillestare sipas dat\u00ebs s\u00eb shtimit. Dhe problemi \u00ebsht\u00eb q\u00eb sa m\u00eb shum\u00eb t\u00eb shtohen rreshta n\u00eb tabel\u00eb, aq 'm\u00eb e r\u00ebnd\u00eb' do t\u00eb b\u00ebhet renditja. N\u00eb praktik\u00eb, situata t\u00eb tilla duhet shmangur, prandaj do t\u00eb shtojm\u00eb nj\u00eb indeks n\u00eb dat\u00ebn e shtimit dhe t\u00eb shohim n\u00ebse \u00ebsht\u00eb 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 paraprakisht t\u00eb lexuara 5, lexime logjike t\u00eb lobit 0, lexime fizike t\u00eb lobit 0, lexime paraprakisht t\u00eb lobit 0.\n<\/code><\/pre>\n<p>\nN\u00eb m\u00ebnyr\u00eb t\u00eb qart\u00eb, gj\u00ebrat jan\u00eb p\u00ebrmir\u00ebsuar shum\u00eb. Por jan\u00eb zgjidhur t\u00eb gjitha problemet? T\u00eb ndryshojm\u00eb k\u00ebrkes\u00ebn p\u00ebr t\u00eb gjetur porosi, ku vlera totale e mallrave 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 paraprak, por numri i v\u00ebrtet\u00eb i leximeve logjike \u00ebsht\u00eb gati dy her\u00eb m\u00eb i lart\u00eb se kur skanohet tabela n\u00eb t\u00ebr\u00ebsi. Ka nj\u00eb zgjidhje \u2014 n\u00ebse nga indeksi ekzistues krijojm\u00eb nj\u00eb indeks t\u00eb p\u00ebrb\u00ebr\u00eb dhe shtojm\u00eb si fush\u00eb t\u00eb dyt\u00eb vler\u00ebn totale t\u00eb mallrave, at\u00ebher\u00eb p\u00ebrs\u00ebri do t\u00eb arrijm\u00eb 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 d\u00ebshiroj t\u00eb shpreh k\u00ebtu jan\u00eb:<\/p>\n<ul>\n<li>Shtimi i \u00e7do kriteri t\u00eb ri ose renditjes 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 lexojm\u00eb vet\u00ebm nj\u00eb pjes\u00eb t\u00eb t\u00eb dh\u00ebnave dhe jo t\u00eb gjitha rezultatet q\u00eb plot\u00ebsojn\u00eb kushtet 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 te k\u00ebrkesa e dyt\u00eb, e p\u00ebrmendur n\u00eb fillim \u2014 ajo q\u00eb num\u00ebron numrin e regjistrimeve q\u00eb plot\u00ebsojn\u00eb kriterin e k\u00ebrkimit. T\u00eb marrim t\u00eb nj\u00ebjtin shembull \u2014 k\u00ebrkesa p\u00ebr porosi q\u00eb jan\u00eb m\u00eb t\u00eb shtrenjta se 100 dollar\u00eb:<\/p>\n<pre><code class=\"sql\">SELECT COUNT(1) FROM Sales.SalesOrderHeader\nWHERE SubTotal &gt; 100\n<\/code><\/pre>\n<p>\nN\u00eb prani t\u00eb indeksit t\u00eb p\u00ebrb\u00ebr\u00eb, t\u00eb p\u00ebrmendur m\u00eb lart, 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 paraprakisht t\u00eb lexuara 0, lexime logjike t\u00eb lobit 0, lexime fizike t\u00eb lobit 0, lexime paraprakisht t\u00eb lobit 0.<\/code><\/pre>\n<p>\nAjo q\u00eb k\u00ebrkesa kalon krejt indeksin nuk \u00ebsht\u00eb befasi, pasi fusha SubTotal nuk \u00ebsht\u00eb n\u00eb pozitat e para, prandaj k\u00ebrkesa nuk mund ta p\u00ebrdor\u00eb at\u00eb. Problemi zgjidhet duke shtuar nj\u00eb tjet\u00ebr indeks n\u00eb fush\u00ebn SubTotal, dhe rezultati \u00ebsht\u00eb tashm\u00eb 48 lexime logjike.<\/p>\n<p>Mund t\u00eb japim edhe disa shembuj t\u00eb tjer\u00eb t\u00eb k\u00ebrkesave p\u00ebr num\u00ebrim, por thelbi do t\u00eb mbetet i nj\u00ebjt\u00eb: <b>marrja e nj\u00eb pjese t\u00eb t\u00eb dh\u00ebnave dhe num\u00ebrimi i shum\u00ebs totale \u2014 jan\u00eb dy k\u00ebrkesa thelb\u00ebsisht t\u00eb ndryshme<\/b>, dhe secila k\u00ebrkon masat e veta p\u00ebr optimizim. N\u00eb p\u00ebrgjith\u00ebsi nuk do t\u00eb mund t\u00eb gjejm\u00eb nj\u00eb kombinim indeksesh q\u00eb funksionon nj\u00ebsoj mir\u00eb p\u00ebr t\u00eb dyja k\u00ebrkesat.<\/p>\n<p>Prandaj, nj\u00eb nga k\u00ebrkesat e r\u00ebnd\u00ebsishme q\u00eb duhet t\u00eb sqarojm\u00eb gjat\u00eb zhvillimit t\u00eb k\u00ebtij zgjidhje k\u00ebrkimi \u00ebsht\u00eb n\u00ebse p\u00ebr biznesin \u00ebsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb shoh\u00eb numrin e p\u00ebrgjithsh\u00ebm t\u00eb objekteve t\u00eb gjetura. Muitas her\u00eb ndodh q\u00eb nuk \u00ebsht\u00eb. Dhe navigimi p\u00ebrmes numrave specifik\u00eb t\u00eb faqes, n\u00eb mendimin tim, \u00ebsht\u00eb nj\u00eb zgjidhje me nj\u00eb gam\u00eb p\u00ebrdorimi shum\u00eb t\u00eb ngusht\u00eb, pasi shumica e skenar\u00ebve me paging duket si \"kaloni n\u00eb faqen e ardhshme\".<\/p>\n<h2>Nj\u00eb variant i paging-ut #2<\/h2>\n<p>\nSupozoni se p\u00ebr p\u00ebrdoruesit nuk \u00ebsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb din\u00eb numrin e 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, ndryshimi i vet\u00ebm \u00ebsht\u00eb se nuk ka mund\u00ebsi p\u00ebr t\u00eb kaluar n\u00eb numra specifik\u00eb t\u00eb faqeve, dhe tani kjo tabel\u00eb p\u00ebr t\u00eb treguar nuk ka nevoj\u00eb t\u00eb dij\u00eb se sa ka gjithsej. Por lind pyetja - si do ta dij\u00eb tabela n\u00ebse ka t\u00eb dh\u00ebna p\u00ebr faqen e ardhshme (p\u00ebr t\u00eb shfaqur sakt\u00ebsisht lidhjen \"T\u00eb ardhshme\")?<\/p>\n<p>P\u00ebrgjigja \u00ebsht\u00eb shum\u00eb e thjesht\u00eb: mund t\u00eb lexojm\u00eb nga baza m\u00eb nj\u00eb rekord m\u00eb shum\u00eb se sa nevojitet p\u00ebr shfaqje, dhe ekzistenca e k\u00ebtij \"rekordi shtes\u00eb\" do t\u00eb tregoj\u00eb n\u00ebse ka nj\u00eb sasi tjet\u00ebr. K\u00ebshtu, p\u00ebr t\u00eb marr\u00eb nj\u00eb faqe t\u00eb dh\u00ebnash, do t\u00eb nevojitet t\u00eb kryhet vet\u00ebm nj\u00eb k\u00ebrkes\u00eb, q\u00eb ndjesh\u00ebm p\u00ebrmir\u00ebson performanc\u00ebn dhe leht\u00ebson mb\u00ebshtetje t\u00eb till\u00eb funksionaliteti. Kam pasur nj\u00eb rast n\u00eb praktik\u00eb kur heqja e num\u00ebrimit t\u00eb p\u00ebrgjithsh\u00ebm t\u00eb regjistrimeve p\u00ebrshpejtoi ofrimin e rezultateve 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 \"prapa\" dhe \"p\u00ebrpara\", si n\u00eb shembullin 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 t\u00eb marr\u00eb sasin\u00eb tjet\u00ebr \u00ebsht\u00eb rrotullimi nga p\u00ebrdoruesi t\u00eb gjith\u00eb rezultateve t\u00eb shfaqura deri n\u00eb fund. Cila do qoft\u00eb zgjidhja vizuale, parimi i marrjes s\u00eb t\u00eb dh\u00ebnave mbetet i nj\u00ebjt\u00eb.<\/p>\n<h2>Detajet e realizimit t\u00eb paging-ut<\/h2>\n<p>\nN\u00eb t\u00eb gjitha shembujt e k\u00ebrkesave t\u00eb paraqitura m\u00eb sip\u00ebr, p\u00ebrdoret qasja \"shkalla + sasi\", kur n\u00eb vet\u00eb k\u00ebrkes\u00ebn tregohen nga cilat rreshta t\u00eb rezultatit dhe sa rreshta duhet t\u00eb kthehen. Fillimisht, le t\u00eb shohim si \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb organizojm\u00eb kalimin e parametrave n\u00eb k\u00ebt\u00eb rast. N\u00eb praktik\u00eb kam takuar disa m\u00ebnyra:<\/p>\n<ul>\n<li>Numri rendor i faqes se kerkuar (pageIndex), madhesia e faqes (pageSize).<\/li>\n<li>Numri rendor i shenjestruese se pare (startIndex), numri maksimal i shenjestrimeve ne rezultat (count).<\/li>\n<li>Numri rendor i shenjestruese se pare (startIndex), numri rendor i shenjestruese se fundit (endIndex).<\/li>\n<\/ul>\n<p>\nN\u00eb shikim t\u00eb par\u00eb, mund t\u00eb duket se kjo \u00ebsht\u00eb aq elementare sa nuk ka ndonj\u00eb ndryshim. Por nuk \u00ebsht\u00eb k\u00ebshtu \u2014 opsioni m\u00eb i p\u00ebrshtatsh\u00ebm dhe universale \u00ebsht\u00eb i dyti (startIndex, count). Ka disa arsye p\u00ebr k\u00ebt\u00eb:<\/p>\n<ul>\n<li>P\u00ebr qasjen me leximin +1 shenjestrues, e p\u00ebrmendur m\u00eb lart, opsioni i par\u00eb me pageIndex dhe pageSize \u00ebsht\u00eb tep\u00ebr i paarsyesh\u00ebm. P\u00ebr shembull, duam t\u00eb shfaqim 50 shenjestra n\u00eb faqe. Sipas algoritmit t\u00eb p\u00ebrmendur m\u00eb par\u00eb, duhet t\u00eb lexojm\u00eb nj\u00eb shenjest\u00ebr m\u00eb shum\u00eb se sa duam. N\u00ebse ky \"+1\" nuk \u00ebsht\u00eb caktuar n\u00eb server, rezulton se p\u00ebr faqen e par\u00eb duhet t\u00eb k\u00ebrkojm\u00eb shenjestra nga 1 n\u00eb 51, p\u00ebr t\u00eb dyt\u00ebn \u2014 nga 51 n\u00eb 101 dhe k\u00ebshtu me radh\u00eb. N\u00ebse caktojm\u00eb madh\u00ebsin\u00eb e faqes 51 dhe rrisim pageIndex, at\u00ebher\u00eb faqa e dyt\u00eb do t\u00eb kthej\u00eb nga 52 n\u00eb 102 dhe k\u00ebshtu me radh\u00eb. Prandaj, n\u00eb opsionin e par\u00eb, m\u00ebnyra e vetme p\u00ebr t\u00eb realizuar normalisht butonin p\u00ebr t\u00eb kaluar n\u00eb faqen tjet\u00ebr \u00ebsht\u00eb t\u00eb caktosh n\u00eb server leximin e \"shenj\u00ebs\" s\u00eb tep\u00ebrt, q\u00eb do t\u00eb ishte nj\u00eb detaj shum\u00eb i paqart\u00eb.<\/li>\n<li>Opsioni i tret\u00eb nuk ka kuptim n\u00eb t\u00ebr\u00ebsi, sepse p\u00ebr t\u00eb kryer k\u00ebrkesa n\u00eb shumic\u00ebn e bazave t\u00eb t\u00eb dh\u00ebnave gjithmon\u00eb do t\u00eb duhet t\u00eb jap\u00ebsh numrin, jo indeksin e shenjestr\u00ebs s\u00eb fundit. Le t\u00eb thjesht\u00ebsojm\u00eb se heqja e startIndex nga endIndex \u00ebsht\u00eb nj\u00eb operacion i thjesht\u00eb aritmetik, por k\u00ebtu \u00ebsht\u00eb e panevojshme.<\/li>\n<\/ul>\n<p>\nTani duhet t\u00eb p\u00ebrshkruajm\u00eb disavantazhet e implementimit t\u00eb paging-ut p\u00ebrmes \"offset + numri\":<\/p>\n<ul>\n<li>Marrja e \u00e7do faqeje tjet\u00ebr do t\u00eb jet\u00eb m\u00eb e shtrenjt\u00eb dhe m\u00eb e ngadalt\u00eb se ajo paraprake, sepse baza e t\u00eb dh\u00ebnave gjithsesi do t\u00eb duhet t\u00eb kaloj\u00eb p\u00ebrmes t\u00eb gjitha shenjestrave \"nga fillimi\" sipas kritereve t\u00eb k\u00ebrkimit dhe renditjes, e m\u00eb pas t\u00eb ndalet n\u00eb fragmentin e duhur.<\/li>\n<li>Jo t\u00eb gjitha SGBD-t\u00eb mund t\u00eb mb\u00ebshtesin k\u00ebt\u00eb qasje.<\/li>\n<\/ul>\n<p>\nKa alternativa, por ato gjithashtu nuk jan\u00eb perfekte. Qasja e par\u00eb e till\u00eb quhet \"keyset paging\" ose \"metoda e k\u00ebrkimit\" dhe p\u00ebrfshin: pas marrjes s\u00eb nj\u00eb sasie mund t\u00eb ruani vlerat e fushave n\u00eb shenjen e fundit t\u00eb faqes, dhe m\u00eb pas t'i p\u00ebrdorni ato p\u00ebr t\u00eb marr\u00eb sasit\u00eb e tjera. P\u00ebr shembull, ne kemi kryer nj\u00eb k\u00ebrkes\u00eb t\u00eb till\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 kushte e cila \u00ebsht\u00eb cituar m\u00eb sip\u00ebr, ka mund\u00ebsi t\u00eb madhe t\u00eb kaloj\u00eb shum\u00eb rreshta t\u00eb nevojsh\u00ebm. P\u00ebr t\u00eb sjell\u00eb qart\u00ebsi n\u00eb k\u00ebt\u00eb k\u00ebrkes\u00eb, \u00ebsht\u00eb e nevojshme t\u00eb shtohet n\u00eb kushtin nj\u00eb fush\u00eb unike (t\u00eb supozojm\u00eb se 75074 \u00ebsht\u00eb vlera e fundit e \u00e7el\u00ebsit kryesor nga porcja e 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 gjendet, 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 t\u00eb ve\u00e7ant\u00eb, me an\u00eb t\u00eb s\u00eb cilit mund t\u00eb marr\u00ebsh porcionin tjet\u00ebr 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 ky \u00ebsht\u00eb nj\u00eb m\u00ebnyr\u00eb e shk\u00eblqyer p\u00ebr t\u00eb realizuar faqosjen me kalimin e vazhduesh\u00ebm mes faqeve (varianti #2 i p\u00ebrmendur m\u00eb sip\u00ebr). Disavantazhet e tij t\u00eb mundshme: mb\u00ebshtetet shum\u00eb pak n\u00eb t\u00eb gjitha DBM-t\u00eb; identifikuesi i marr\u00eb p\u00ebr porcionin tjet\u00ebr mund t\u00eb ket\u00eb nj\u00eb afat t\u00eb kufizuar, q\u00eb n\u00eb p\u00ebrgjith\u00ebsi nuk i p\u00ebrshtatet realizimit t\u00eb nd\u00ebrveprimit me p\u00ebrdoruesin (si, p\u00ebr shembull, ElasticSearch scroll API).<\/p>\n<h2>Filtrimi i komplikuar<\/h2>\n<p>\nPo ecur me sfidimin. Supozoni se ka pasur nj\u00eb k\u00ebrkes\u00eb p\u00ebr t\u00eb realizuar at\u00eb q\u00eb quhet k\u00ebrkim i faceted, i njohur mir\u00eb nga dyqanet online. Shembujt e m\u00ebsip\u00ebrm t\u00eb bazuar n\u00eb tabel\u00ebn e porosive nuk jan\u00eb shum\u00eb tregues n\u00eb k\u00ebt\u00eb rast, k\u00ebshtu q\u00eb 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 \/>\nCila \u00ebsht\u00eb ideja e k\u00ebrkimit faceted? Ajo \u00ebsht\u00eb q\u00eb p\u00ebr \u00e7do element filtri t\u00eb tregoj\u00eb numrin e regjistrimeve q\u00eb p\u00ebrputhen me k\u00ebt\u00eb kriter. <i>duke marr\u00eb parasysh filtrat e zgjedhur n\u00eb t\u00eb gjitha kategorit\u00eb e tjera.<\/i>.<\/p>\n<p>P\u00ebr shembull, n\u00ebse ne zgjedhim n\u00eb k\u00ebt\u00eb shembull kategorin\u00eb Bikes dhe ngjyr\u00ebn Black, tabela do t\u00eb tregoj\u00eb vet\u00ebm bi\u00e7ikleta me ngjyr\u00eb t\u00eb zez\u00eb, por p\u00ebr k\u00ebt\u00eb:<\/p>\n<ul>\n<li>P\u00ebr \u00e7do kriter t\u00eb grupit \u00abCategories\u00bb do t\u00eb tregohet numri i produkteve nga kjo kategori me ngjyr\u00eb t\u00eb zez\u00eb.<\/li>\n<li>P\u00ebr \u00e7do kriter t\u00eb grupit \u00abColors\u00bb 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 rezultatit t\u00eb daljes 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\u00ebr m\u00eb tep\u00ebr sh\u00ebnojm\u00eb kategorin\u00eb \u00abClothing\u00bb, tabela do t\u00eb tregoj\u00eb gjithashtu dhe veshjet me ngjyr\u00eb t\u00eb zez\u00eb q\u00eb jan\u00eb n\u00eb dispozicion. Numri i produkteve me ngjyr\u00eb t\u00eb zez\u00eb n\u00eb seksionin \u00abColor\u00bb gjithashtu do t\u00eb ri-kalkulohet sipas kushteve t\u00eb reja, vet\u00ebm n\u00eb seksionin \u00abCategories\u00bb nuk do t\u00eb ndryshoj\u00eb asgj\u00eb... Shpresoj se 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 le t\u00eb imagjinojm\u00eb se si mund t\u00eb realizohet kjo n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash relacional. \u00c7do grup kriteresh, si Kategoria 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 \/>\nCili \u00ebsht\u00eb problemi me k\u00ebt\u00eb zgjidhje? Shum\u00eb thjesht - ajo nuk \u00ebsht\u00eb e shkall\u00ebzueshme. \u00c7do seksion filtri k\u00ebrkon nj\u00eb k\u00ebrkes\u00eb t\u00eb ve\u00e7ant\u00eb p\u00ebr llogaritjen e num\u00ebrave 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 seksione filtrore, q\u00eb mund t\u00eb p\u00ebrb\u00ebj\u00eb nj\u00eb problem t\u00eb r\u00ebnd\u00ebsish\u00ebm p\u00ebr performanc\u00ebn.<\/p>\n<p>Zakonisht pas k\u00ebtyre pohimeve, m\u00eb ofrojn\u00eb disa zgjidhje, dmth:<\/p>\n<ul>\n<li>Bashkoni t\u00eb gjitha num\u00ebrimet n\u00eb nj\u00eb k\u00ebrkes\u00eb. N\u00eb m\u00ebnyr\u00eb teknike, kjo \u00ebsht\u00eb e mundur me p\u00ebrdorimin e fjal\u00ebs ky\u00e7e UNION, por kjo nuk ndihmon shum\u00eb n\u00eb p\u00ebrformanc\u00eb \u2014 ende do t\u00eb duhet q\u00eb baza e t\u00eb dh\u00ebnave t\u00eb ekzekutoj\u00eb \"nga e para\" secilin nga fragmentet.<\/li>\n<li>Keshoni num\u00ebrimet. Kjo m\u00eb sugjerohet pothuajse \u00e7do her\u00eb kur p\u00ebrshkruaj problemin. Problemi \u00ebsht\u00eb se n\u00eb p\u00ebrgjith\u00ebsi kjo \u00ebsht\u00eb e pamundur. Supozoni se kemi 10 \"facet\u00eb\", secila me 5 vlera. Kjo \u00ebsht\u00eb nj\u00eb situat\u00eb shum\u00eb \"skrom\u00eb\" krahasuar me at\u00eb q\u00eb mund t\u00eb shohim n\u00eb t\u00eb nj\u00ebjtat dyqane online. Zgjedhja e nj\u00eb elementi t\u00eb facet\u00ebs ndikon n\u00eb numrat n\u00eb 9-t\u00eb t\u00eb tjera, n\u00eb other words, p\u00ebr secil\u00ebn kombinim kriteresh, numrat mund t\u00eb jen\u00eb t\u00eb ndrysh\u00ebm. N\u00eb total, n\u00eb shembullin ton\u00eb ka 50 kritere q\u00eb p\u00ebrdoruesi mund t\u00eb zgjedh\u00eb, prandaj kombinimet e mundshme do t\u00eb jen\u00eb 250. Koha dhe memorie nuk do t\u00eb mjaftojn\u00eb p\u00ebr t\u00eb mbushur nj\u00eb masiv t\u00eb till\u00eb t\u00eb dh\u00ebnash. K\u00ebtu dikush mund t\u00eb kund\u00ebrshtoj\u00eb dhe t\u00eb thot\u00eb se jo t\u00eb gjitha kombinimet jan\u00eb reale dhe p\u00ebrdoruesi rrall\u00eb zgjedh m\u00eb shum\u00eb se 5-10 kritere. Po, \u00ebsht\u00eb e mundur t\u00eb b\u00ebhet nj\u00eb ngarkes\u00eb e p\u00ebrmbysur dhe t\u00eb kesh num\u00ebrimin vet\u00ebm p\u00ebr at\u00eb q\u00eb \u00ebsht\u00eb zgjedhur ndonj\u00ebher\u00eb, por sa m\u00eb shum\u00eb t\u00eb jen\u00eb opsionet e zgjedhjes, aq m\u00eb pak efektiv do t\u00eb jet\u00eb ky kesh dhe aq m\u00eb t\u00eb dukshme do t\u00eb jen\u00eb probleme 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 detyr\u00eb e till\u00eb tashm\u00eb ka zgjidhje t\u00eb mjaftueshme efektive, q\u00eb punojn\u00eb parashikuesh\u00ebm me sasi t\u00eb m\u00ebdha t\u00eb dh\u00ebnash. P\u00ebr secilin prej k\u00ebtyre opsioneve ka kuptim t\u00eb ndahet ri-caktoja e facet\u00ebve dhe marrja e faqes s\u00eb rezultateve n\u00eb dy k\u00ebrkesa paralele n\u00eb server dhe t\u00eb organizohet nd\u00ebrfaqja e p\u00ebrdoruesit n\u00eb m\u00ebnyr\u00eb q\u00eb ngarkimi i t\u00eb dh\u00ebnave p\u00ebr facet\u00ebt \"t\u00eb mos pengoj\u00eb\" paraqitjen e rezultateve t\u00eb k\u00ebrkimit.<\/p>\n<ul>\n<li>Thirrni rikapitulimin e \"faceteve\" sa m\u00eb rrall\u00eb t\u00eb jet\u00eb e mundur. P\u00ebr shembull, mos e rikapitulloni gjith\u00e7ka p\u00ebr \u00e7do ndryshim kriteri k\u00ebrkese, por n\u00eb vend t\u00eb k\u00ebsaj gjeni numrin total t\u00eb rezultateve q\u00eb p\u00ebrgjigjen kushteve aktuale dhe ofroni p\u00ebrdoruesit t\u00eb tregoni ato \u2014 \"1425 regjistrime t\u00eb gjetura, t\u00eb tregoni?\" P\u00ebrdoruesi mund t\u00eb vazhdoj\u00eb t\u00eb ndryshoj\u00eb kushtet e k\u00ebrkes\u00ebs ose t\u00eb klikoj\u00eb butonin \"tregoni\". Vet\u00ebm n\u00eb k\u00ebt\u00eb rast do t\u00eb kryhen t\u00eb gjitha k\u00ebrkesat p\u00ebr marrjen e rezultateve dhe rikapitullimin e numrave n\u00eb t\u00eb gjitha \"facetet\". N\u00eb k\u00ebt\u00eb kontekst, \u00ebsht\u00eb e qart\u00eb se do t\u00eb duhet t\u00eb merret me k\u00ebrkes\u00ebn p\u00ebr marrjen e numrit total t\u00eb rezultateve dhe optimizimin e saj. Ky m\u00ebnyr\u00eb mund t\u00eb haset n\u00eb shum\u00eb dyqane t\u00eb vogla online. \u00cbsht\u00eb e qart\u00eb se kjo nuk \u00ebsht\u00eb nj\u00eb ila\u00e7 p\u00ebr k\u00ebt\u00eb problem, 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 facetet, si Solr, ElasticSearch, Sphinx dhe t\u00eb tjer\u00eb. T\u00eb gjitha ato jan\u00eb t\u00eb dizajnuara p\u00ebr nd\u00ebrtimin e \"faceteve\" dhe e b\u00ebjn\u00eb k\u00ebt\u00eb mjaft efektivisht p\u00ebrmes indekseve t\u00eb inversuara. Si funksionojn\u00eb sistemet e k\u00ebrkimit, pse ato jan\u00eb m\u00eb efikase n\u00eb k\u00ebto raste se bazat e t\u00eb dh\u00ebnave me q\u00ebllim t\u00eb p\u00ebrgjithsh\u00ebm, \u00e7far\u00eb jan\u00eb praktikat dhe pengesat \u2014 kjo \u00ebsht\u00eb nj\u00eb tem\u00eb p\u00ebr nj\u00eb artikull t\u00eb ve\u00e7ant\u00eb. K\u00ebtu dua t\u00eb theksoj se motor\u00ebt e k\u00ebrkimit nuk mund t\u00eb z\u00ebvend\u00ebsojn\u00eb depozitat primare t\u00eb t\u00eb dh\u00ebnave, por p\u00ebrdoren si nj\u00eb shtes\u00eb: \u00e7do ndryshim n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave kryesore, q\u00eb ka r\u00ebnd\u00ebsi p\u00ebr k\u00ebrkimin, sinkronizohet n\u00eb indeksin e k\u00ebrkimit; mekanizmi i k\u00ebrkimit nd\u00ebrvepron zakonisht vet\u00ebm me motorin e k\u00ebrkimit dhe nuk i 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 m\u00ebnyr\u00eb t\u00eb besueshme. T\u00eb gjitha varen nga k\u00ebrkesat p\u00ebr \"koh\u00ebn e reagimit\". N\u00ebse koha midis ndryshimit n\u00eb baz\u00ebn kryesore dhe \"nderhyrjes\" s\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 fundmi dhe i indekson ato. N\u00ebse k\u00ebrkohet koha minimale e mundshme e reagimit, mund t\u00eb realizoni di\u00e7ka si <noindex><a rel=\"nofollow\" href=\"https:\/\/microservices.io\/patterns\/data\/transactional-outbox.html\">outbox transaksional<\/a><\/noindex> p\u00ebr t\u00eb d\u00ebrguar p\u00ebrdit\u00ebsimet 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>Realizimi i paginimit n\u00eb an\u00ebn e serverit \u00ebsht\u00eb nj\u00eb komplikim serioz, dhe ka kuptim ta aplikohet vet\u00ebm p\u00ebr grupe t\u00eb dh\u00ebnash q\u00eb rriten shpejt ose thjesht jan\u00eb t\u00eb m\u00ebdha. Si t\u00eb vler\u00ebsojm\u00eb \"t\u00eb madhe\" ose \"shpejt rrit\u00ebse\" \u2014 nuk ka nj\u00eb recet\u00eb absolutisht t\u00eb sakt\u00eb, por un\u00eb do t\u00eb ndjekja 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 n\u00eb server dhe transmetimin n\u00eb rrjet \u00ebsht\u00eb brenda k\u00ebrkesave t\u00eb performanc\u00ebs \u2014 nuk ka kuptim t\u00eb implementohet paginimi n\u00eb an\u00ebn e serverit.<\/li>\n<li>Mund t\u00eb ndodh\u00eb q\u00eb n\u00eb periudh\u00ebn afatshkurt\u00ebr nuk parashikohet ndonj\u00eb problem me performanc\u00ebn, sepse t\u00eb dh\u00ebnat jan\u00eb t\u00eb pakta, por koleksioni i t\u00eb dh\u00ebnave po rritet vazhdimisht. N\u00ebse ndonj\u00eb grup t\u00eb dh\u00ebnash n\u00eb perspektiv\u00eb mund t\u00eb nuk p\u00ebrmbush\u00eb pik\u00ebn e m\u00ebparshme \u2014 \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb parashikohet paginimi menj\u00ebher\u00eb.<\/li>\n<\/ul>\n<\/li>\n<li>N\u00ebse nuk ka nj\u00eb k\u00ebrkes\u00eb strikte nga biznesi p\u00ebr t\u00eb treguar numrin total t\u00eb rezultateve ose p\u00ebr t\u00eb shfaqur numrat e faqeve, dhe po ashtu n\u00eb sistemin tuaj nuk ka nj\u00eb motor k\u00ebrkimi \u2014 \u00ebsht\u00eb m\u00eb mir\u00eb q\u00eb k\u00ebto \u00e7\u00ebshtje t\u00eb mos realizohen dhe t\u00eb shqyrtohet varianti #2.<\/li>\n<li>N\u00ebse ka nj\u00eb k\u00ebrkes\u00eb t\u00eb qart\u00eb p\u00ebr k\u00ebrkimin me fasetat, ju keni dy mund\u00ebsi p\u00ebr t\u00eb mos sakrifikuar performanc\u00ebn:\n<ul>\n<li>Mos e ribljeni t\u00eb gjitha numrat n\u00eb \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 kuptuar se ai nuk mund t\u00eb jet\u00eb z\u00ebvend\u00ebsues i baz\u00ebs kryesore t\u00eb t\u00eb dh\u00ebnave, dhe duhet t\u00eb p\u00ebrdoret si nj\u00eb shtes\u00eb p\u00ebr magazin\u00ebn kryesore p\u00ebr t\u00eb trajtuar problemet e k\u00ebrkimit. <\/li>\n<\/ul>\n<\/li>\n<li>Po ashtu, n\u00eb rastin e k\u00ebrkimit me fasetat, 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 sesa marrja e rezultateve, nd\u00ebrsa rezultatet jan\u00eb m\u00eb t\u00eb r\u00ebnd\u00ebsishme p\u00ebr p\u00ebrdoruesin.<\/li>\n<li>N\u00ebse p\u00ebrdorni nj\u00eb baz\u00eb t\u00eb dh\u00ebnash SQL p\u00ebr k\u00ebrkimin, \u00e7do ndryshim n\u00eb kod q\u00eb lidhet me k\u00ebt\u00eb pjes\u00eb duhet t\u00eb testohet mir\u00eb n\u00eb lidhje me performanc\u00ebn n\u00eb volumet p\u00ebrkat\u00ebse t\u00eb t\u00eb dh\u00ebnave (q\u00eb tejkalojn\u00eb volumin n\u00eb baz\u00ebn \"live\"). Gjithashtu, \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, sidomos \u2014 n\u00eb \"live\". Edhe n\u00ebse n\u00eb faz\u00ebn e zhvillimit planet e k\u00ebrkesave ishin n\u00eb rregull, 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.2 - 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.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\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\udd47Paraqitja e rezultateve t\u00eb k\u00ebrkimit dhe problemet me performanc\u00ebn | ProHoster","description":"Nj\u00eb nga skenar\u00ebt e zakonsh\u00ebm n\u00eb t\u00eb gjitha aplikacionet q\u00eb njohim \u00ebsht\u00eb k\u00ebrkimi i t\u00eb dh\u00ebnave sipas kritereve t\u00eb caktuara dhe paraqitja e tyre n\u00eb nj\u00eb format t\u00eb leht\u00eb p\u00ebr t'u lexuar.","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}]}}