{"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\/hu\/blog\/administrirovanie\/vyvod-rezultatov-poiska-i-problemy-s-proizvoditelnostyu","title":{"rendered":"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Az egyik tipikus forgat\u00f3k\u00f6nyv minden ismert alkalmaz\u00e1sban az adatok keres\u00e9se meghat\u00e1rozott krit\u00e9riumok alapj\u00e1n, \u00e9s azok k\u00e9nyelmes olvas\u00e1si form\u00e1tumban t\u00f6rt\u00e9n\u0151 megjelen\u00edt\u00e9se. Itt tov\u00e1bbi lehet\u0151s\u00e9gek is lehetnek, mint p\u00e9ld\u00e1ul a rendez\u00e9s, csoportos\u00edt\u00e1s \u00e9s a lapoz\u00e1s. A feladat alapvet\u0151en trivi\u00e1lis, de sok fejleszt\u0151 sok hib\u00e1t elk\u00f6vet a megold\u00e1s sor\u00e1n, amelyek k\u00e9s\u0151bb a teljes\u00edtm\u00e9nyt rontj\u00e1k. Tekints\u00fck \u00e1t a feladat k\u00fcl\u00f6nb\u00f6z\u0151 megold\u00e1si lehet\u0151s\u00e9geit, \u00e9s fogalmazzunk meg aj\u00e1nl\u00e1sokat a leghat\u00e9konyabb megval\u00f3s\u00edt\u00e1s kiv\u00e1laszt\u00e1s\u00e1hoz.<\/p>\n<p><img decoding=\"async\" alt=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" 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>Lapoz\u00e1si lehet\u0151s\u00e9g #1<\/h2>\n<p>\nA legegyszer\u0171bb lehet\u0151s\u00e9g, ami esz\u00fcnkbe jut - az a hib\u00e1tlan, klasszikus form\u00e1j\u00fa keres\u00e9si eredm\u00e9nyek lapoz\u00e1sa.<\/p>\n<p><img decoding=\"async\" alt=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" src=\"\/wp-content\/uploads\/2020\/03\/4957d9ad21a8a0c70390b224fe76cb33.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTegy\u00fck fel, hogy az alkalmaz\u00e1s rel\u00e1ci\u00f3s adatb\u00e1zist haszn\u00e1l. Ebben az esetben a megfelel\u0151 form\u00e1tumban t\u00f6rt\u00e9n\u0151 inform\u00e1ci\u00f3megjelen\u00edt\u00e9shez k\u00e9t SQL lek\u00e9rdez\u00e9st kell v\u00e9grehajtani:<\/p>\n<ul>\n<li>Az aktu\u00e1lis oldalhoz tartoz\u00f3 sorok lek\u00e9r\u00e9se.<\/li>\n<li>A keres\u00e9si krit\u00e9riumoknak megfelel\u0151 \u00f6sszes sor sz\u00e1m\u00e1nak kisz\u00e1m\u00edt\u00e1sa - ez sz\u00fcks\u00e9ges az oldalak megjelen\u00edt\u00e9s\u00e9hez.<\/li>\n<\/ul>\n<p>\nAz els\u0151 lek\u00e9rdez\u00e9st n\u00e9zz\u00fck meg egy teszt MS SQL adatb\u00e1zis p\u00e9ld\u00e1j\u00e1n. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Microsoft\/sql-server-samples\/releases\/download\/adventureworks\/AdventureWorks2016_EXT.bak\">AdventureWorks <\/a><\/noindex>a 2016-os kiszolg\u00e1l\u00f3n. Ehhez a Sales.SalesOrderHeader t\u00e1bl\u00e1t fogjuk haszn\u00e1lni:<\/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>\nA fenti lek\u00e9rdez\u00e9s az utols\u00f3 50 megrendel\u00e9st jelen\u00edti meg a hozz\u00e1ad\u00e1s d\u00e1tuma szerint cs\u00f6kken\u0151 sorrendben, m\u00e1s szavakkal - az utols\u00f3 50 megrendel\u00e9st.<\/p>\n<p>Ez gyorsan v\u00e9grehajthat\u00f3 a tesztadatb\u00e1zison, de n\u00e9zz\u00fck meg a v\u00e9grehajt\u00e1si tervet \u00e9s a bemeneti-kimeneti statisztik\u00e1t:<\/p>\n<p><img decoding=\"async\" alt=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" src=\"\/wp-content\/uploads\/2020\/03\/248e4b64593c7000216b46777183d639.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">T\u00e1bla 'SalesOrderHeader'. Scan count 1, logikai olvas\u00e1sok 698, fizikai olvas\u00e1sok 0, el\u0151re olvas\u00e1sok 0, lob logikai olvas\u00e1sok 0, lob fizikai olvas\u00e1sok 0, lob el\u0151re olvas\u00e1sok 0.<\/code><\/pre>\n<p>\n<i>A bemeneti\/kimeneti statisztika minden lek\u00e9rdez\u00e9shez a SET STATISTICS IO ON parancs v\u00e9grehajt\u00e1s\u00e1val \u00e9rhet\u0151 el a lek\u00e9rdez\u00e9si k\u00f6rnyezetben.<\/i><\/p>\n<p>Ahogy a v\u00e9grehajt\u00e1si tervb\u0151l l\u00e1that\u00f3, a legink\u00e1bb er\u0151forr\u00e1s-ig\u00e9nyes m\u0171velet a kiv\u00e1lasztott t\u00e1bla \u00f6sszes sor\u00e1nak rendez\u00e9se a hozz\u00e1ad\u00e1s d\u00e1tuma szerint. A probl\u00e9ma az, hogy min\u00e9l t\u00f6bb sor jelenik meg a t\u00e1bl\u00e1ban, ann\u00e1l nehezebb\u00e9 v\u00e1lik a rendez\u00e9s. Az eff\u00e9le helyzeteket a gyakorlatban \u00e9rdemes elker\u00fclni, \u00edgy indexet adunk a hozz\u00e1ad\u00e1s d\u00e1tum\u00e1ra, \u00e9s megn\u00e9zz\u00fck, v\u00e1ltozott-e az er\u0151forr\u00e1s-felhaszn\u00e1l\u00e1s:<\/p>\n<p><img decoding=\"async\" alt=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" src=\"\/wp-content\/uploads\/2020\/03\/a33e1eadf6f8f8b516b9bb834ad7ad86.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">T\u00e1bla 'SalesOrderHeader'. Scan count 1, logikai olvas\u00e1sok 165, fizikai olvas\u00e1sok 0, el\u0151re olvas\u00e1sok 5, lob logikai olvas\u00e1sok 0, lob fizikai olvas\u00e1sok 0, lob el\u0151re olvas\u00e1sok 0.\n<\/code><\/pre>\n<p>\nNyilv\u00e1nval\u00f3an sokkal jobb lett. De vajon minden probl\u00e9ma megold\u00f3dott? M\u00f3dos\u00edtsuk a keres\u00e9si lek\u00e9rdez\u00e9st, hogy a term\u00e9kek \u00f6ssz\u00e9rt\u00e9ke meghaladja a 100 doll\u00e1rt:<\/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=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" src=\"\/wp-content\/uploads\/2020\/03\/e057bfc89e11a31c6d2855b93ec3c747.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">A 'SalesOrderHeader' t\u00e1bla. Ellen\u0151rz\u00e9si sz\u00e1m 1, logikai olvas\u00e1sok 1081, fizikai olvas\u00e1sok 0, el\u0151reolvas\u00e1sok 0, lob logikai olvas\u00e1sok 0, lob fizikai olvas\u00e1sok 0, lob el\u0151reolvas\u00e1sok 0.<\/code><\/pre>\n<p>\n\u00c9rdekes helyzet \u00e1llt el\u0151: a lek\u00e9rdez\u00e9s terve nem sokkal rosszabb, mint az el\u0151z\u0151, de a logikai olvas\u00e1sok sz\u00e1ma majdnem dupl\u00e1ja annak, mint ami a t\u00e1bla teljes \u00e1tvizsg\u00e1l\u00e1sakor volt. A megold\u00e1s az, hogy ha a m\u00e1r megl\u00e9v\u0151 indexb\u0151l \u00f6sszetett indexet k\u00e9sz\u00edt\u00fcnk, \u00e9s m\u00e1sodik mez\u0151k\u00e9nt hozz\u00e1adjuk a term\u00e9kek \u00f6ssz\u00e1r\u00e1t, akkor \u00fajra 165 logikai olvas\u00e1st kapunk:<\/p>\n<pre><code class=\"sql\">CREATE INDEX IX_SalesOrderHeader_OrderDate_SubTotal on Sales.SalesOrderHeader(OrderDate, SubTotal);\n<\/code><\/pre>\n<p>\nEzt a p\u00e9ldasort m\u00e9g sok\u00e1ig folytathatn\u00e1nk, de k\u00e9t alapvet\u0151 gondolatot szeretn\u00e9k itt kifejezni:<\/p>\n<ul>\n<li>B\u00e1rmely \u00faj krit\u00e9rium vagy rendez\u00e9si sorrend hozz\u00e1ad\u00e1sa a keres\u00e9si lek\u00e9rdez\u00e9shez jelent\u0151sen befoly\u00e1solhatja annak v\u00e9grehajt\u00e1si sebess\u00e9g\u00e9t.<\/li>\n<li>De ha csak az adatok egy r\u00e9sz\u00e9t szeretn\u00e9nk kiolvasni, nem pedig az \u00f6sszes tal\u00e1latot, amely megfelel a keres\u00e9si felt\u00e9teleknek \u2013 rengeteg m\u00f3dja van az ilyen lek\u00e9rdez\u00e9s optimaliz\u00e1l\u00e1s\u00e1nak.<\/li>\n<\/ul>\n<p>\nMost t\u00e9rj\u00fcnk \u00e1t a m\u00e1sodik lek\u00e9rdez\u00e9sre, amelyet az elej\u00e9n eml\u00edtett\u00fcnk \u2013 arra, amely azokat a rekordokat sz\u00e1molja, amelyek megfelelnek a keres\u00e9si krit\u00e9riumnak. Vegy\u00fck ugyanezt a p\u00e9ld\u00e1t \u2013 rendel\u00e9seket keres\u00fcnk, amelyek 100 doll\u00e1rn\u00e1l dr\u00e1g\u00e1bbak:<\/p>\n<pre><code class=\"sql\">SELECT COUNT(1) FROM Sales.SalesOrderHeader\nWHERE SubTotal &gt; 100\n<\/code><\/pre>\n<p>\nA fent eml\u00edtett \u00f6sszetett index megl\u00e9t\u00e9ben ezt kapjuk:<\/p>\n<p><img decoding=\"async\" alt=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" src=\"\/wp-content\/uploads\/2020\/03\/7beab0c83a50e2d68a83a965df555ec9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">T\u00e1bla 'SalesOrderHeader'. Scan count 1, logikai olvas\u00e1sok 698, fizikai olvas\u00e1sok 0, el\u0151re olvas\u00e1sok 0, lob logikai olvas\u00e1sok 0, lob fizikai olvas\u00e1sok 0, lob el\u0151re olvas\u00e1sok 0.<\/code><\/pre>\n<p>\nAz, hogy a lek\u00e9rdez\u00e9s az eg\u00e9sz indexet \u00e1tvizsg\u00e1lja \u2013 nem meglep\u0151, hiszen a SubTotal mez\u0151 nem az els\u0151 helyen \u00e1ll, ez\u00e9rt a lek\u00e9rdez\u00e9s nem tudja azt kihaszn\u00e1lni. A probl\u00e9ma \u00fagy oldhat\u00f3 meg, hogy \u00fajabb indexet k\u00e9sz\u00edt\u00fcnk a SubTotal mez\u0151re, ami v\u00e9g\u00fcl m\u00e1r csak 48 logikai olvas\u00e1st eredm\u00e9nyez.<\/p>\n<p>Tov\u00e1bbi p\u00e9ld\u00e1kat is hozhatn\u00e1nk a sz\u00e1mol\u00f3 lek\u00e9rdez\u00e9sekre, de a l\u00e9nyeg ugyanaz marad: <b>az adatok lek\u00e9rdez\u00e9se \u00e9s a teljes sz\u00e1molt mennyis\u00e9g \u2013 ez k\u00e9t alapvet\u0151en k\u00fcl\u00f6nb\u00f6z\u0151 lek\u00e9rdez\u00e9s<\/b>, \u00e9s mindkett\u0151 saj\u00e1t optimaliz\u00e1l\u00e1si int\u00e9zked\u00e9seket ig\u00e9nyel. \u00c1ltal\u00e1noss\u00e1gban nem lesz lehets\u00e9ges olyan indexkombin\u00e1ci\u00f3t tal\u00e1lni, amely mindk\u00e9t lek\u00e9rdez\u00e9sn\u00e9l ugyan\u00fagy j\u00f3l m\u0171k\u00f6dik.<\/p>\n<p>Ez\u00e9rt az egyik fontos k\u00f6vetelm\u00e9ny, amit tiszt\u00e1zni kell egy ilyen keres\u00e9si megold\u00e1s fejleszt\u00e9se sor\u00e1n, hogy val\u00f3ban fontos-e a v\u00e1llalkoz\u00e1s sz\u00e1m\u00e1ra, hogy l\u00e1ssa a megtal\u00e1lt elemek \u00f6sszes sz\u00e1m\u00e1t. Gyakran nem. Szerintem a konkr\u00e9t oldalsz\u00e1mokra t\u00f6rt\u00e9n\u0151 navig\u00e1ci\u00f3 nagyon sz\u0171k alkalmaz\u00e1si ter\u00fclet, mivel a legt\u00f6bb esetben a lapoz\u00e1s \u00edgy n\u00e9z ki: \u201eugorj a k\u00f6vetkez\u0151 oldalra\u201d.<\/p>\n<h2>Lapoz\u00e1s #2<\/h2>\n<p>\nTegy\u00fck fel, hogy a felhaszn\u00e1l\u00f3knak nem fontos ismerni a megtal\u00e1lt elemek \u00f6sszes sz\u00e1m\u00e1t. Pr\u00f3b\u00e1ljuk meg egyszer\u0171s\u00edteni a keres\u00e9si oldalt:<\/p>\n<p><img decoding=\"async\" alt=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" src=\"\/wp-content\/uploads\/2020\/03\/66f5ee6dc1a52f14e55ae31e05c502b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVal\u00f3j\u00e1ban az egyetlen v\u00e1ltoz\u00e1s az, hogy nincs lehet\u0151s\u00e9g a konkr\u00e9t oldalsz\u00e1mokra t\u00f6rt\u00e9n\u0151 ugr\u00e1sra, \u00e9s most ennek a t\u00e1bl\u00e1zatnak nem kell tudnia, h\u00e1ny \u00f6sszesen lehet. De felmer\u00fcl a k\u00e9rd\u00e9s - hogyan tudja a t\u00e1bl\u00e1zat, hogy van-e adat a k\u00f6vetkez\u0151 oldalra (hogy helyesen megjelen\u00edtse a \u201eK\u00f6vetkez\u0151\u201d linket)?<\/p>\n<p>A v\u00e1lasz nagyon egyszer\u0171: ki lehet olvasni az adatb\u00e1zisb\u00f3l egy bejegyz\u00e9ssel t\u00f6bbet, mint amennyire sz\u00fcks\u00e9g van a megjelen\u00edt\u00e9shez, \u00e9s ennek a \u201et\u00f6bblet\u201d bejegyz\u00e9snek a megl\u00e9te fogja mutatni, van-e k\u00f6vetkez\u0151 adag. \u00cdgy a l\u00e1tott adatok egy oldal\u00e1nak megszerz\u00e9s\u00e9hez csak egy lek\u00e9rdez\u00e9st kell v\u00e9grehajtani, ami l\u00e9nyegesen jav\u00edtja a teljes\u00edtm\u00e9nyt \u00e9s megk\u00f6nny\u00edti ennek a funkci\u00f3nak a fenntart\u00e1s\u00e1t. Volt olyan tapasztalatom, amikor az \u00f6sszes rekord sz\u00e1m\u00e1nak megsz\u00e1ml\u00e1l\u00e1s\u00e1r\u00f3l val\u00f3 lemond\u00e1s a tal\u00e1latok kiad\u00e1s\u00e1t 4-5-sz\u00f6r felgyors\u00edtotta.<\/p>\n<p>Ehhez a megk\u00f6zel\u00edt\u00e9shez t\u00f6bb felhaszn\u00e1l\u00f3i fel\u00fclet-v\u00e1ltozat l\u00e9tezik: a \u201evissza\u201d \u00e9s \u201eel\u0151re\u201d gombok, mint a fenti p\u00e9ld\u00e1ban, az \u201em\u00e9g t\u00f6bb bet\u00f6lt\u00e9se\u201d gomb, amely egyszer\u0171en hozz\u00e1ad egy \u00faj adagot a megjelen\u00edtett eredm\u00e9nyekhez, \u00e9s a \u201ev\u00e9gtelen g\u00f6rget\u00e9s\u201d, amely az \u201em\u00e9g t\u00f6bb bet\u00f6lt\u00e9se\u201d elv\u00e9n m\u0171k\u00f6dik, de a k\u00f6vetkez\u0151 adag megszerz\u00e9s\u00e9nek jele, hogy a felhaszn\u00e1l\u00f3 az \u00f6sszes megjelen\u00edtett eredm\u00e9nyt v\u00e9gigp\u00f6rgeti. Ak\u00e1rhogy is van a vizu\u00e1lis megold\u00e1s, az adatsz\u0171r\u00e9s elve ugyanaz marad.<\/p>\n<h2>A lapoz\u00e1s megval\u00f3s\u00edt\u00e1s\u00e1nak finoms\u00e1gai<\/h2>\n<p>\nMinden p\u00e9ld\u00e1ban, amit fentebb eml\u00edtettem, a \u201eeltol\u00e1s + mennyis\u00e9g\u201d megk\u00f6zel\u00edt\u00e9st alkalmazz\u00e1k, amikor a lek\u00e9rdez\u00e9sben meg van hat\u00e1rozva, hogy a tal\u00e1latok melyik sor\u00e1t\u00f3l kezdve \u00e9s h\u00e1ny sort kell visszak\u00fcldeni. El\u0151sz\u00f6r n\u00e9zz\u00fck meg, hogyan lehet a param\u00e9terek \u00e1tad\u00e1s\u00e1t a legjobban megszervezni. Gyakorlatomban t\u00f6bb m\u00f3dszert is l\u00e1ttam:<\/p>\n<ul>\n<li>A k\u00e9rt oldal sorsz\u00e1ma (pageIndex), az oldal m\u00e9rete (pageSize).<\/li>\n<li>Az els\u0151 rekord sorsz\u00e1ma, amelyet vissza kell adni (startIndex), a maxim\u00e1lis rekordok sz\u00e1ma az eredm\u00e9nyben (count).<\/li>\n<li>Az els\u0151 rekord sorsz\u00e1ma, amelyet vissza kell adni (startIndex), az utols\u00f3 rekord sorsz\u00e1ma, amelyet vissza kell adni (endIndex).<\/li>\n<\/ul>\n<p>\nEls\u0151 pillant\u00e1sra \u00fagy t\u0171nhet, hogy ez annyira egyszer\u0171, hogy nincs k\u00fcl\u00f6nbs\u00e9g. De nem \u00edgy van \u2014 a m\u00e1sodik opci\u00f3 (startIndex, count) a legk\u00e9nyelmesebb \u00e9s leguniverz\u00e1lisabb megold\u00e1s. Ennek t\u00f6bb oka is van:<\/p>\n<ul>\n<li>A fenti, +1 rekord kivon\u00e1sos megk\u00f6zel\u00edt\u00e9s alapj\u00e1n az els\u0151 opci\u00f3, a pageIndex \u00e9s pageSize rendk\u00edv\u00fcl k\u00e9nyelmetlen. P\u00e9ld\u00e1ul, ha 50 rekordot szeretn\u00e9nk megjelen\u00edteni egy oldalon. A fenti algoritmus szerint egy rekorddal t\u00f6bbet kell olvasni, mint ami sz\u00fcks\u00e9ges. Ha ezt a \u201e+1\u201d-et nem v\u00e9gezz\u00fck el a szerveren, akkor az els\u0151 oldal eset\u00e9ben az 1-t\u0151l 51-ig kell lek\u00e9rdezni a rekordokat, a m\u00e1sodikn\u00e1l pedig 51-t\u0151l 101-ig stb. Ha az oldal m\u00e9ret\u00e9t 51-re \u00e1ll\u00edtjuk \u00e9s n\u00f6velj\u00fck a pageIndex-et, akkor a m\u00e1sodik oldal 52-t\u0151l 102-ig fog visszaadni stb. Ennek megfelel\u0151en az els\u0151 opci\u00f3ban az egyetlen m\u00f3dja a k\u00f6vetkez\u0151 oldalra val\u00f3 navig\u00e1ci\u00f3 normaliz\u00e1l\u00e1s\u00e1nak \u2014 hogy a szerver oldal\u00e1n behelyettes\u00edtj\u00fck a \u201et\u00f6bblet\u201d sor kivon\u00e1s\u00e1t, ami nagyon diszkr\u00e9t r\u00e9szlet lesz.<\/li>\n<li>A harmadik opci\u00f3 teljesen \u00e9rtelmetlen, mivel a lek\u00e9rdez\u00e9sek v\u00e9grehajt\u00e1s\u00e1hoz a legt\u00f6bb adatb\u00e1zisban mindenk\u00e9ppen \u00e1t kell adni a rekordok sz\u00e1m\u00e1t, nem az utols\u00f3 rekord index\u00e9t. Lehet, hogy a startIndex \u00e9s endIndex kivon\u00e1s egyszer\u0171 aritmetikai m\u0171velet, de itt sz\u00fcks\u00e9gtelen.<\/li>\n<\/ul>\n<p>\nMost a \u201et\u00e1vols\u00e1g + mennyis\u00e9g\u201d elv alapj\u00e1n a paging megval\u00f3s\u00edt\u00e1s\u00e1nak h\u00e1tr\u00e1nyait kell le\u00edrni:<\/p>\n<ul>\n<li>Minden k\u00f6vetkez\u0151 oldal lek\u00e9r\u00e9se k\u00f6lts\u00e9gesebb \u00e9s lassabb lesz, mint az el\u0151z\u0151, mert az adatb\u00e1zisnak minden rekordot v\u00e9gig kell n\u00e9znie \u201eaz elej\u00e9t\u0151l\u201d a keres\u00e9si \u00e9s rendez\u00e9si krit\u00e9riumok szerint, majd meg\u00e1llni a sz\u00fcks\u00e9ges szakaszn\u00e1l.<\/li>\n<li>Nem minden DBMS t\u00e1mogatja ezt a megk\u00f6zel\u00edt\u00e9st.<\/li>\n<\/ul>\n<p>\nVannak alternat\u00edv\u00e1k, de ezek sem t\u00f6k\u00e9letesek. Az egyik ilyen megk\u00f6zel\u00edt\u00e9st \u201ekeyset paging\u201d-nek vagy \u201eseek method\u201d-nak h\u00edvj\u00e1k, \u00e9s a k\u00f6vetkez\u0151k\u00e9ppen m\u0171k\u00f6dik: a lap utols\u00f3 rekordj\u00e1nak mez\u0151\u00e9rt\u00e9keit elmenthetj\u00fck, majd ezeket felhaszn\u00e1lhatjuk a k\u00f6vetkez\u0151 adag lek\u00e9rdez\u00e9s\u00e9re. P\u00e9ld\u00e1ul, \u00edgy hajtottunk v\u00e9gre egy lek\u00e9rdez\u00e9st:<\/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>\nAz utols\u00f3 bejegyz\u00e9sben a rendel\u00e9si d\u00e1tum \u00e9rt\u00e9k\u00e9t &#8216;2014-06-29&#8217; kaptuk. Ez\u00e9rt a k\u00f6vetkez\u0151 oldal lek\u00e9r\u00e9s\u00e9hez megpr\u00f3b\u00e1lhatunk v\u00e9grehajtani valami ilyesmit:<\/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>\nA probl\u00e9ma az, hogy az OrderDate nem egyedi mez\u0151, \u00e9s a fenti felt\u00e9tel val\u00f3sz\u00edn\u0171leg sok sz\u00fcks\u00e9ges sort kihagy. Az egy\u00e9rtelm\u0171s\u00e9g \u00e9rdek\u00e9ben ehhez a lek\u00e9rdez\u00e9shez hozz\u00e1 kell adni egy egyedi mez\u0151t (tegy\u00fck fel, hogy 75074 az utols\u00f3 els\u0151dleges kulcs \u00e9rt\u00e9ke az els\u0151 adathalaz\u00e1sb\u00f3l):<\/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>\nEz a megold\u00e1s helyesen fog m\u0171k\u00f6dni, de \u00e1ltal\u00e1ban nehezen lehet optimaliz\u00e1lni, mivel a felt\u00e9tel OR oper\u00e1tort tartalmaz. Ha a rendel\u00e9si d\u00e1tum n\u00f6veked\u00e9s\u00e9vel a primer kulcs \u00e9rt\u00e9ke is n\u0151, akkor a felt\u00e9telt egyszer\u0171s\u00edthetj\u00fck, csak a SalesOrderID sz\u0171r\u0151t hagyva meg. De ha a primer kulcs \u00e9rt\u00e9ke \u00e9s a rendez\u00e9si mez\u0151 k\u00f6z\u00f6tt nincs szoros korrel\u00e1ci\u00f3 \u2013 a legt\u00f6bb DBMS-ben az OR elker\u00fcl\u00e9se nem lehets\u00e9ges. Az egyetlen kiv\u00e9tel, amir\u0151l tudok, a PostgreSQL, amely teljes m\u00e9rt\u00e9kben t\u00e1mogatja a tuple-\u00f6k \u00f6sszehasonl\u00edt\u00e1s\u00e1t, \u00e9s a fent eml\u00edtett felt\u00e9telt \u201eWHERE (OrderDate, SalesOrderID) &lt; (&#8216;2014-06-29&#8217;, 75074)\u201d form\u00e1ban lehet megfogalmazni. Ha ezekb\u0151l a k\u00e9t mez\u0151b\u0151l \u00e1ll\u00f3 \u00f6sszetett kulcs van, akkor az ilyen lek\u00e9rdez\u00e9snek el\u00e9g k\u00f6nny\u0171nek kell lennie.<\/p>\n<p>Egy m\u00e1sodik alternat\u00edv megk\u00f6zel\u00edt\u00e9st tal\u00e1lhatunk p\u00e9ld\u00e1ul a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/6.8\/search-request-scroll.html\">ElasticSearch scroll API<\/a><\/noindex> vagy <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@gary.strange\/understanding-cosmosdb-continuation-tokens-hasmoreresults-and-connectionpolicy-requesttimeouts-3ed1fadfa81d\">Cosmos DB<\/a><\/noindex> \u2014 amikor a lek\u00e9rdez\u00e9s az adatok mellett egy speci\u00e1lis azonos\u00edt\u00f3t is visszaad, amelyen kereszt\u00fcl megszerezhet\u0151 a k\u00f6vetkez\u0151 adathalaz\u00e1s. Ha ez az azonos\u00edt\u00f3 korl\u00e1tlan \u00e9lettartam\u00fa (mint a Cosmos DB eset\u00e9ben), akkor ez nagyszer\u0171 m\u00f3dja a lapoz\u00e1s megval\u00f3s\u00edt\u00e1s\u00e1nak a lapok k\u00f6z\u00f6tt val\u00f3 folyamatos \u00e1tmenethez (a fent eml\u00edtett #2 opci\u00f3val). Lehets\u00e9ges h\u00e1tr\u00e1nyai: nem minden DBMS t\u00e1mogatja; a k\u00f6vetkez\u0151 adathalaz\u00e1shoz kapott azonos\u00edt\u00f3nak korl\u00e1tozott \u00e9lettartama lehet, ami \u00e1ltal\u00e1noss\u00e1gban nem alkalmas a felhaszn\u00e1l\u00f3i interakci\u00f3 megval\u00f3s\u00edt\u00e1s\u00e1ra (mint p\u00e9ld\u00e1ul az ElasticSearch scroll API eset\u00e9n).<\/p>\n<h2>Bonyolult sz\u0171r\u00e9s<\/h2>\n<p>\nN\u00e9zz\u00fck meg a feladatot r\u00e9szletesebben. Tegy\u00fck fel, hogy megjelent a k\u00f6vetelm\u00e9ny a \u00fagynevezett faceted search megval\u00f3s\u00edt\u00e1s\u00e1ra, amely j\u00f3l ismert az online boltokban. A fent eml\u00edtett p\u00e9ld\u00e1k a rendel\u00e9s t\u00e1bl\u00e1zat\u00e1nak alapj\u00e1n nem t\u00fal informat\u00edvak ebben az esetben, ez\u00e9rt t\u00e9rj\u00fcnk \u00e1t az AdventureWorks adatb\u00e1zis Product t\u00e1bl\u00e1zat\u00e1ra:<\/p>\n<p><img decoding=\"async\" alt=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" src=\"\/wp-content\/uploads\/2020\/03\/070890a3cb79de3edc69b60b5300efe7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMi a faceted search l\u00e9nyege? Az, hogy minden sz\u0171r\u0151elemhez megmutatja a megfelel\u0151 krit\u00e9riumnak megfelel\u0151 bejegyz\u00e9sek sz\u00e1m\u00e1t <i>figyelembe v\u00e9ve az \u00f6sszes t\u00f6bbi kateg\u00f3ri\u00e1ban kiv\u00e1lasztott sz\u0171r\u0151t<\/i>.<\/p>\n<p>P\u00e9ld\u00e1ul, ha ebben a p\u00e9ld\u00e1ban a Bikes kateg\u00f3ri\u00e1t \u00e9s a Black sz\u00ednt v\u00e1lasztjuk, a t\u00e1bl\u00e1zat csak fekete sz\u00edn\u0171 ker\u00e9kp\u00e1rokat fog megjelen\u00edteni, de:<\/p>\n<ul>\n<li>Minden krit\u00e9rium eset\u00e9ben a \u201eKateg\u00f3ri\u00e1k\u201d csoportb\u00f3l megjelenik a fekete sz\u00edn\u0171 term\u00e9kek sz\u00e1ma.<\/li>\n<li>Minden krit\u00e9rium eset\u00e9ben a \u201eSz\u00ednek\u201d csoportb\u00f3l megjelenik a fekete sz\u00edn\u0171 ker\u00e9kp\u00e1rok sz\u00e1ma.<\/li>\n<\/ul>\n<p>\nItt egy p\u00e9lda az ilyen felt\u00e9telek eredm\u00e9nyeinek megjelen\u00edt\u00e9s\u00e9re:<\/p>\n<p><img decoding=\"async\" alt=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" src=\"\/wp-content\/uploads\/2020\/03\/7c8ec4d8b427f1f59f0129afebe74b08.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHa emellett a \u201eClothing\u201d kateg\u00f3ri\u00e1t is bejel\u00f6lj\u00fck, a t\u00e1bl\u00e1zat megmutatja az el\u00e9rhet\u0151 fekete sz\u00edn\u0171 ruh\u00e1zati term\u00e9keket is. A fekete sz\u00edn\u0171 term\u00e9kek sz\u00e1ma a \u201eSz\u00edn\u201d szekci\u00f3ban szint\u00e9n \u00faj felt\u00e9telek szerint lesz \u00fajrasz\u00e1m\u00edtva, de a \u201eKateg\u00f3ri\u00e1k\u201d szekci\u00f3ban semmi sem v\u00e1ltozik\u2026 Rem\u00e9lem, ezek a p\u00e9ld\u00e1k elegend\u0151ek ahhoz, hogy meg\u00e9rts\u00fck a faceted search m\u0171k\u00f6d\u00e9s\u00e9nek szok\u00e1sos algoritmus\u00e1t.<\/p>\n<p>Most k\u00e9pzelj\u00fck el, hogyan lehet ezt megval\u00f3s\u00edtani egy rel\u00e1ci\u00f3s adatb\u00e1zisban. Minden krit\u00e9riumcsoport, mint p\u00e9ld\u00e1ul a Kateg\u00f3ria \u00e9s a Sz\u00edn, k\u00fcl\u00f6n lek\u00e9rdez\u00e9st ig\u00e9nyel:<\/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=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" 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=\"A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9ny probl\u00e9m\u00e1i.\" src=\"\/wp-content\/uploads\/2020\/03\/82e1e6ab0fae683d383e3fecf4e3a15a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMi nem stimmel ezzel a megold\u00e1ssal? Nagyon egyszer\u0171 \u2014 nem sk\u00e1l\u00e1zhat\u00f3 j\u00f3l. Minden sz\u0171r\u0151r\u00e9sz k\u00e9r k\u00fcl\u00f6n lek\u00e9rdez\u00e9st a mennyis\u00e9gek sz\u00e1mol\u00e1s\u00e1hoz, \u00e9s ezek a lek\u00e9rdez\u00e9sek nem a legegyszer\u0171bbek. Az online boltokban egyes kateg\u00f3ri\u00e1kban ak\u00e1r t\u00f6bb tucat sz\u0171r\u0151r\u00e9sz is lehet, ami komoly probl\u00e9m\u00e1t jelenthet a teljes\u00edtm\u00e9ny szempontj\u00e1b\u00f3l.<\/p>\n<p>\u00c1ltal\u00e1ban ezek ut\u00e1n n\u00e9h\u00e1ny megold\u00e1st javasolnak nekem, nevezetesen:<\/p>\n<ul>\n<li>\u00d6sszevonni az \u00f6sszes mennyis\u00e9gi sz\u00e1m\u00edt\u00e1st egy k\u00e9r\u00e9sbe. Technikai szempontb\u00f3l ez lehets\u00e9ges az UNION kulcssz\u00f3 seg\u00edts\u00e9g\u00e9vel, de teljes\u00edtm\u00e9ny szempontj\u00e1b\u00f3l nem seg\u00edt sokat \u2013 az adatb\u00e1zisnak ugyan\u00fagy \"null\u00e1r\u00f3l\" kell v\u00e9grehajtania az egyes darabokat.<\/li>\n<li>Mennyis\u00e9gek gyors\u00edt\u00f3t\u00e1raz\u00e1sa. Ezt gyakorlatilag minden alkalommal javasolj\u00e1k, amikor a probl\u00e9m\u00e1mat ismertetem. A csavar az, hogy ez \u00e1ltal\u00e1nos esetben lehetetlen. Tegy\u00fck fel, hogy van 10 \"f\u00f3kuszter\u00fclet\", amelyben 5 \u00e9rt\u00e9k tal\u00e1lhat\u00f3. Ez egy nagyon \"skromm\" helyzet ahhoz k\u00e9pest, amit az online boltokban l\u00e1thatunk. Egy f\u00f3kuszter\u00fclet elem\u00e9nek kiv\u00e1laszt\u00e1sa befoly\u00e1solja a m\u00e1sik 9 mennyis\u00e9g\u00e9t, m\u00e1s szavakkal, minden krit\u00e9riumkombin\u00e1ci\u00f3n\u00e1l a mennyis\u00e9gek k\u00fcl\u00f6nb\u00f6z\u0151ek lehetnek. A mi p\u00e9ld\u00e1nkban \u00f6sszesen 50 krit\u00e9rium \u00e1ll rendelkez\u00e9sre, amelyet a felhaszn\u00e1l\u00f3 v\u00e1laszthat, ennek megfelel\u0151en lehets\u00e9ges kombin\u00e1ci\u00f3k sz\u00e1ma 250. Az ilyen adathalmaszt\u00e1sra nem lesz elegend\u0151 sem a mem\u00f3ria, sem az id\u0151. Itt fel lehet l\u00e9pni azzal, hogy nem minden kombin\u00e1ci\u00f3 val\u00f3s, \u00e9s a felhaszn\u00e1l\u00f3k ritk\u00e1n v\u00e1lasztanak t\u00f6bb mint 5-10 krit\u00e9riumot. Igen, lehet lazy loading \u00e9s gyors\u00edt\u00f3t\u00e1r csak azokra a mennyis\u00e9gekre, amiket valaha v\u00e1lasztottak, de min\u00e9l t\u00f6bb v\u00e1laszt\u00e1si lehet\u0151s\u00e9g van, ann\u00e1l kev\u00e9sb\u00e9 hat\u00e9kony lesz az ilyen gyors\u00edt\u00f3t\u00e1r, \u00e9s ann\u00e1l szembet\u0171n\u0151bbek lesznek a v\u00e1laszid\u0151 probl\u00e9m\u00e1i (k\u00fcl\u00f6n\u00f6sen, ha az adathalmaz rendszeresen v\u00e1ltozik).<\/li>\n<\/ul>\n<p>\nSzerencs\u00e9re az ilyen feladatoknak m\u00e1r r\u00e9gen l\u00e9teznek meglehet\u0151sen hat\u00e9kony megold\u00e1sai, amelyek el\u0151re l\u00e1that\u00f3an j\u00f3l m\u0171k\u00f6dnek nagy adatmennyis\u00e9g eset\u00e9n. B\u00e1rmelyik esetben \u00e9rdemes p\u00e1rhuzamosan sz\u00e9tv\u00e1lasztani a f\u00f3kuszter\u00fcletek \u00fajrasz\u00e1m\u00edt\u00e1s\u00e1t \u00e9s az eredm\u00e9nyoldal lek\u00e9r\u00e9s\u00e9t, \u00e9s \u00fagy szervezni a felhaszn\u00e1l\u00f3i fel\u00fcletet, hogy a f\u00f3kuszter\u00fcletek adatainak bet\u00f6lt\u00e9se \"ne zavarja\" a keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9s\u00e9t.<\/p>\n<ul>\n<li>A teljes sz\u0171r\u0151sz\u00e1m\u00edt\u00e1st a lehet\u0151 legritk\u00e1bban kell elv\u00e9gezni. P\u00e9ld\u00e1ul ne sz\u00e1m\u00edtsuk \u00fajra az \u00f6sszeset a keres\u00e9si felt\u00e9telek megv\u00e1ltoztat\u00e1sakor, hanem keress\u00fck meg a megfelel\u0151 eredm\u00e9nyek \u00f6sszes\u00edtett sz\u00e1m\u00e1t, \u00e9s aj\u00e1nljuk fel a felhaszn\u00e1l\u00f3nak, hogy megjelen\u00edtse \u0151ket \u2013 \"1425 tal\u00e1lat, megjelen\u00edtj\u00fck?\" A felhaszn\u00e1l\u00f3 vagy folytathatja a keres\u00e9si felt\u00e9telek m\u00f3dos\u00edt\u00e1s\u00e1t, vagy r\u00e1kattinthat a \"megjelen\u00edt\u00e9s\" gombra. Csak az ut\u00f3bbi esetben hajt\u00f3dnak v\u00e9gre az \u00f6sszes lek\u00e9rdez\u00e9s az eredm\u00e9nyek megszerz\u00e9s\u00e9re \u00e9s a sz\u0171r\u0151k \u00fajrasz\u00e1ml\u00e1l\u00e1s\u00e1ra. Meg kell eml\u00edteni, hogy figyelembe kell venni az \u00f6sszes\u00edtett tal\u00e1latok lek\u00e9rdez\u00e9s\u00e9t \u00e9s annak optimaliz\u00e1l\u00e1s\u00e1t. Ezt a m\u00f3dszert sok kis internetes boltban tal\u00e1lkozhatunk. Nyilv\u00e1nval\u00f3, hogy ez nem csodaszer a probl\u00e9m\u00e1ra, de egyszer\u0171 esetekben j\u00f3 kompromisszum lehet.<\/li>\n<li>Haszn\u00e1ljunk keres\u0151motorokat az eredm\u00e9nyek keres\u00e9s\u00e9re \u00e9s a sz\u0171r\u0151k sz\u00e1ml\u00e1l\u00e1s\u00e1ra, mint p\u00e9ld\u00e1ul a Solr, ElasticSearch, Sphinx \u00e9s m\u00e1sok. Mindegyik\u00fck a sz\u0171r\u0151k l\u00e9trehoz\u00e1s\u00e1ra van optimaliz\u00e1lva, \u00e9s ezt el\u00e9g hat\u00e9konyan teszik a megford\u00edtott indexel\u00e9s r\u00e9v\u00e9n. Hogyan \u00e9p\u00fclnek fel a keres\u0151motorok, mi\u00e9rt hat\u00e9konyabbak ilyen esetekben, mint a hagyom\u00e1nyos adatb\u00e1zisok, mik a legjobb gyakorlatok \u00e9s a buktat\u00f3k \u2013 ezek mind k\u00fcl\u00f6n t\u00e9ma. Itt szeretn\u00e9m kiemelni, hogy a keres\u0151motor nem helyettes\u00edtheti az alapvet\u0151 adatb\u00e1zist, kieg\u00e9sz\u00edt\u00e9sk\u00e9nt haszn\u00e1lj\u00e1k: az alapadatb\u00e1zisban t\u00f6rt\u00e9nt b\u00e1rmilyen, a keres\u00e9s szempontj\u00e1b\u00f3l fontos v\u00e1ltoz\u00e1st szinkroniz\u00e1lni kell a keres\u00e9si indexszel; a keres\u00e9si mechanizmus \u00e1ltal\u00e1ban csak a keres\u0151motorral l\u00e9p kapcsolatba, \u00e9s nem fordul az alapadatb\u00e1zishoz. Az egyik legfontosabb szempont itt az, hogyan szervezz\u00fck meg ezt a szinkroniz\u00e1l\u00e1st megb\u00edzhat\u00f3an. Minden a v\u00e1laszid\u0151 k\u00f6vetelm\u00e9nyeit\u0151l f\u00fcgg. Ha a v\u00e1ltoz\u00e1s az alapadatb\u00e1zisban \u00e9s a keres\u00e9s \"megnyilv\u00e1nul\u00e1sa\" k\u00f6z\u00f6tti id\u0151 nem kritikus, l\u00e9trehozhatunk egy szolg\u00e1ltat\u00e1st, amely n\u00e9h\u00e1ny percenk\u00e9nt keresi a nemr\u00e9giben m\u00f3dos\u00edtott rekordokat \u00e9s indexeli azokat. Ha a lehet\u0151 legalacsonyabb v\u00e1laszid\u0151 sz\u00fcks\u00e9ges, valami hasonl\u00f3t lehet megval\u00f3s\u00edtani, mint a <noindex><a rel=\"nofollow\" href=\"https:\/\/microservices.io\/patterns\/data\/transactional-outbox.html\">transactional outbox<\/a><\/noindex> a keres\u0151szolg\u00e1ltat\u00e1s friss\u00edt\u00e9seinek k\u00fcld\u00e9s\u00e9re.<\/li>\n<\/ul>\n<p><\/p>\n<h2>K\u00f6vetkeztet\u00e9sek<\/h2>\n<p><\/p>\n<ol>\n<li>A szerveroldali pagin\u00e1l\u00e1s megval\u00f3s\u00edt\u00e1sa komoly bonyodalmakat jelent, \u00e9s csak olyan gyorsan n\u00f6vekv\u0151, vagy egyszer\u0171en csak nagy adathalmazok eset\u00e9n \u00e9rdemes alkalmazni. A \"nagy\" vagy \"gyorsan n\u00f6vekv\u0151\" \u00e9rt\u00e9k\u00e9nek meghat\u00e1roz\u00e1s\u00e1hoz nincs abszol\u00fat pontos recept, de az al\u00e1bbi megk\u00f6zel\u00edt\u00e9st javasoln\u00e1m:\n<ul>\n<li>Ha a teljes adatgy\u0171jtem\u00e9ny szerveroldali id\u0151tartamot \u00e9s h\u00e1l\u00f3zati \u00e1tviteleket figyelembe v\u00e9ve norm\u00e1lisan belef\u00e9r a teljes\u00edtm\u00e9ny k\u00f6vetelm\u00e9nyekbe, akkor nincs \u00e9rtelme szerveroldali pagin\u00e1l\u00e1s megval\u00f3s\u00edt\u00e1s\u00e1nak.<\/li>\n<li>El\u0151fordulhat, hogy a k\u00f6zelj\u00f6v\u0151ben nem v\u00e1rhat\u00f3 teljes\u00edtm\u00e9nyprobl\u00e9ma, mivel az adatok sz\u00e1ma kev\u00e9s, de az adatok gy\u0171jtem\u00e9nye folyamatosan n\u0151. Ha egy adatgy\u0171jtem\u00e9ny a j\u00f6v\u0151ben val\u00f3sz\u00edn\u0171leg m\u00e1r nem felel meg az el\u0151z\u0151 pontnak \u2014 \u00e9rdemes lenne azonnal beletenni a pagin\u00e1l\u00e1st.<\/li>\n<\/ul>\n<\/li>\n<li>Ha az \u00fczleti oldalon nincs szigor\u00fa k\u00f6vetelm\u00e9ny a teljes eredm\u00e9ny sz\u00e1m\u00e1nak megjelen\u00edt\u00e9s\u00e9re vagy az oldalsz\u00e1mok megjelen\u00edt\u00e9s\u00e9re, \u00e9s nem \u00e1ll rendelkez\u00e9sre keres\u0151motor a rendszerben \u2014 \u00e9rdemes ezeket a szempontokat figyelmen k\u00edv\u00fcl hagyni, \u00e9s a 2. opci\u00f3t m\u00e9rlegelni.<\/li>\n<li>Ha vil\u00e1gos k\u00f6vetelm\u00e9ny van a faceted search-re, akkor k\u00e9t lehet\u0151s\u00e9g \u00e1ll rendelkez\u00e9sre a teljes\u00edtm\u00e9ny fel\u00e1ldoz\u00e1sa n\u00e9lk\u00fcl:\n<ul>\n<li>Ne sz\u00e1molja \u00fajra az \u00f6sszes mennyis\u00e9get a keres\u00e9si krit\u00e9riumok minden megv\u00e1ltoztat\u00e1sakor.<\/li>\n<li>Haszn\u00e1ljon olyan keres\u0151motorokat, mint a Solr, ElasticSearch, Sphinx \u00e9s m\u00e1sok. De fontos \u00e9rteni, hogy ez nem helyettes\u00edti az alapadatb\u00e1zist, \u00e9s kieg\u00e9sz\u00edt\u00e9sk\u00e9nt kell haszn\u00e1lnia a f\u0151 t\u00e1rol\u00f3ra a keres\u00e9si feladatok megold\u00e1s\u00e1ra. <\/li>\n<\/ul>\n<\/li>\n<li>A faceted search eset\u00e9n \u00e9rdemes a keres\u00e9si eredm\u00e9nyek oldal\u00e1nak lek\u00e9r\u00e9s\u00e9t \u00e9s a mennyis\u00e9gek sz\u00e1m\u00edt\u00e1s\u00e1t k\u00e9t p\u00e1rhuzamos lek\u00e9rdez\u00e9sre bontani. A mennyis\u00e9gek sz\u00e1ml\u00e1l\u00e1sa tov\u00e1bb tarthat, mint az eredm\u00e9nyek lek\u00e9r\u00e9se, m\u00edg az eredm\u00e9nyek fontosabbak a felhaszn\u00e1l\u00f3 sz\u00e1m\u00e1ra.<\/li>\n<li>Ha SQL adatb\u00e1zist haszn\u00e1l keres\u00e9sre, b\u00e1rmilyen k\u00f3dm\u00f3dos\u00edt\u00e1s, amely erre a r\u00e9szre vonatkozik, alaposan tesztelve kell legyen a teljes\u00edtm\u00e9ny szempontj\u00e1b\u00f3l a megfelel\u0151 adatmennyis\u00e9gen (meg kell haladnia a \"\u00e9les\" adatb\u00e1zis m\u00e9ret\u00e9t). Az is k\u00edv\u00e1natos, hogy az \u00f6sszes adatb\u00e1zis p\u00e9ld\u00e1nyon, k\u00fcl\u00f6n\u00f6sen a \"\u00e9les\" adatb\u00e1zison monitorozza a lek\u00e9rdez\u00e9sek v\u00e9grehajt\u00e1si idej\u00e9t. M\u00e9g ha a fejleszt\u00e9si szakaszban a lek\u00e9rdez\u00e9si tervek j\u00f3l is voltak, az adatmennyis\u00e9g n\u00f6veked\u00e9s\u00e9vel a helyzet jelent\u0151sen megv\u00e1ltozhat.<\/li>\n<\/ol>\n<p>Forr\u00e1s: <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.3 - 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\/hu\/blog\/administrirovanie\/vyvod-rezultatov-poiska-i-problemy-s-proizvoditelnostyu\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\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\/hu\/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\udd47A keres\u00e9si eredm\u00e9nyek megjelen\u00edt\u00e9se \u00e9s a teljes\u00edtm\u00e9nnyel kapcsolatos probl\u00e9m\u00e1k | ProHoster","description":"Az egyik tipikus forgat\u00f3k\u00f6nyv minden ismert alkalmaz\u00e1sban az adatkeres\u00e9s meghat\u00e1rozott krit\u00e9riumok szerint \u00e9s azok k\u00e9nyelmes, olvashat\u00f3 form\u00e1ban t\u00f6rt\u00e9n\u0151 megjelen\u00edt\u00e9se.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/vyvod-rezultatov-poiska-i-problemy-s-proizvoditelnostyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/75530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=75530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/75530\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/75531"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=75530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=75530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=75530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}