Għaliex għandek bżonn appoġġ strumentali għall-paġnar fuq iċ-ċwievet?

Hi kollha! Jien żviluppatur backend li nikteb mikroservizzi f'Java + Spring. Naħdem f'wieħed mit-timijiet interni tal-iżvilupp tal-prodott f'Tinkoff.

Għaliex għandek bżonn appoġġ strumentali għall-paġnar fuq iċ-ċwievet?

Fit-tim tagħna, spiss tqum il-kwistjoni tal-ottimizzazzjoni tal-mistoqsijiet f'DBMS. Dejjem trid tkun ftit aktar mgħaġġla, imma mhux dejjem tista' tgħaddi b'indiċijiet mibnija b'mod maħsub — trid tfittex xi soluzzjonijiet. Waqt waħda minn dawn il-wanderings madwar il-web fit-tfittxija ta 'ottimizzazzjonijiet raġonevoli meta taħdem ma' databases, sibt Il-blog ta’ Marcus Wynand ta’ għajnuna bla tarf, awtur ta' SQL Performance Explained. Dan huwa dak it-tip rari ta’ blog li fih tista’ taqra l-artikoli kollha wara xulxin.

Nixtieq nittraduċilek artiklu qasir ta' Marcus. Jista 'jissejjaħ sa ċertu punt manifest li jfittex li jiġbed l-attenzjoni għall-problema l-qadima, iżda għadha rilevanti tal-prestazzjoni tal-operazzjoni offset skont l-istandard SQL.

F'xi postijiet se nissupplimenta lill-awtur bi spjegazzjonijiet u kummenti. Se nirreferi għall-postijiet kollha bħal dawn bħala “madwar.” għal aktar ċarezza

Introduzzjoni żgħira

Naħseb li ħafna nies jafu kemm hu problematiku u bil-mod ix-xogħol mal-paġna tagħżel permezz tal-offset. Kont taf li jista 'jiġi sostitwit faċilment b'disinn aktar effiċjenti?

Għalhekk, il-keyword offset tgħid lid-database biex taqbeż l-ewwel n rekords fit-talba. Madankollu, id-database għad trid taqra dawn l-ewwel n rekords mid-diska, fl-ordni mogħtija (nota: applika l-issortjar jekk ikun speċifikat), u allura biss ikun possibbli li r-rekords jiġu lura minn n+1 'il quddiem. L-iktar ħaġa interessanti hija li l-problema mhijiex fl-implimentazzjoni speċifika fid-DBMS, iżda fid-definizzjoni oriġinali skont l-istandard:

… ir-ringieli l-ewwel jiġu magħżula skont il- u mbagħad limitati billi jitwaqqa’ n-numru ta’ ringieli speċifikati fil- mill-bidu...
-SQL:2016, Parti 2, 4.15.3 Tabelli derivati ​​(nota: bħalissa l-aktar standard użat)

Il-punt ewlieni hawnhekk huwa li l-offset jieħu parametru wieħed - in-numru ta 'rekords li taqbeż, u dak hu. Wara din id-definizzjoni, id-DBMS jista 'biss jirkupra r-rekords kollha u mbagħad jarmi dawk mhux meħtieġa. Ovvjament, din id-definizzjoni ta 'offset iġġiegħelna nagħmlu xogħol żejjed. U lanqas jimpurta jekk huwiex SQL jew NoSQL.

Biss ftit aktar uġigħ

Il-problemi bil-kumpens ma jispiċċawx hemm, u hawn għaliex. Jekk, bejn il-qari ta' żewġ paġni ta' data mid-disk, operazzjoni oħra ddaħħal rekord ġdid, x'se jiġri f'dan il-każ?

Għaliex għandek bżonn appoġġ strumentali għall-paġnar fuq iċ-ċwievet?

Meta l-offset jintuża biex taqbeż ir-rekords minn paġni preċedenti, fis-sitwazzjoni li żżid rekord ġdid bejn qari ta' paġni differenti, x'aktarx ikollok duplikati (nota: dan huwa possibbli meta naqraw paġna b'paġna billi tuża l-ordni b'kostruzzjoni, imbagħad fin-nofs tal-produzzjoni tagħna jista 'jikseb dħul ġdid).

Il-figura turi din is-sitwazzjoni b'mod ċar. Il-bażi taqra l-ewwel 10 rekords, u wara jiddaħħal rekord ġdid, li jikkumpensa r-rekords kollha moqrija b'1. Imbagħad il-bażi tieħu paġna ġdida mill-10 rekords li jmiss u tibda mhux mill-11, kif suppost, iżda mill- 10, idduplikat dan ir-rekord. Hemm anomaliji oħra assoċjati mal-użu ta 'din l-espressjoni, iżda din hija l-aktar komuni.

Kif diġà skoprejna, dawn mhumiex problemi ta 'DBMS speċifiku jew l-implimentazzjonijiet tagħhom. Il-problema hija fid-definizzjoni tal-paġnar skont l-istandard SQL. Aħna ngħidu lid-DBMS liema paġna għandha ġġib jew kemm rekords taqbeż. Id-database sempliċement ma tistax tottimizza tali talba, peress li hemm ftit wisq informazzjoni għal dan.

Ta 'min iċċara wkoll li din mhix problema b'kelma prinċipali speċifika, iżda pjuttost bis-semantika tal-mistoqsija. Hemm bosta sintassi oħra li huma identiċi fin-natura problematika tagħhom:

  • Il-keyword offset hija kif issemma qabel.
  • Kostruzzjoni ta 'żewġ kliem prinċipali limitu [offset] (għalkemm limitu innifsu mhux daqshekk ħażin).
  • Iffiltrar bil-limiti t'isfel, ibbażat fuq in-numerazzjoni tar-ringieli (per eżempju, row_number(), rownum, eċċ.).

Dawn l-espressjonijiet kollha sempliċement jgħidulek kemm taqbeż linji, l-ebda informazzjoni jew kuntest addizzjonali.

Aktar tard f'dan l-artikolu, il-keyword offset tintuża bħala sommarju ta 'dawn l-għażliet kollha.

Ħajja mingħajr OFFSET

Issa ejja nimmaġinaw kif tkun id-dinja tagħna mingħajr dawn il-problemi kollha. Jirriżulta li l-ħajja mingħajr offset mhix daqshekk diffiċli: b'għażla, tista 'tagħżel biss dawk ir-ringieli li għadna ma rajniex (nota: jiġifieri, dawk li ma kinux fil-paġna ta' qabel), billi tuża kundizzjoni f'fejn.

F'dan il-każ, nibdew mill-fatt li tagħżel huma eżegwiti fuq sett ordnat (ordni qadima tajba minn). Peress li għandna sett ordnat, nistgħu nużaw filtru pjuttost sempliċi biex niksbu biss id-dejta li hemm wara l-aħħar rekord tal-paġna preċedenti:

    SELECT ...
    FROM ...
    WHERE ...
    AND id < ?last_seen_id
    ORDER BY id DESC
    FETCH FIRST 10 ROWS ONLY

Dak huwa l-prinċipju kollu ta 'dan l-approċċ. Naturalment, l-affarijiet isiru aktar divertenti meta jintgħażlu b'ħafna kolonni, iżda l-idea għadha l-istess. Huwa importanti li wieħed jinnota li dan id-disinn huwa applikabbli għal ħafna NoSQL-deċiżjonijiet.

Dan l-approċċ jissejjaħ seek method jew keyset pagination. Issolvi l-problema tar-riżultat f'wiċċ l-ilma (nota: is-sitwazzjoni bil-kitba bejn il-paġna taqra deskritta qabel) u, ovvjament, dak li nħobbu lkoll, taħdem aktar malajr u aktar stabbli mill-offset klassiku. L-istabbiltà tinsab fil-fatt li l-ħin tal-ipproċessar tat-talba ma jiżdiedx fi proporzjon man-numru tat-tabella mitluba (nota: jekk trid titgħallem aktar dwar ix-xogħol ta 'approċċi differenti għall-paġnar, tista' ara l-preżentazzjoni tal-awtur. Tista' ssib ukoll punti ta' riferiment komparattivi għal metodi differenti hemmhekk).

Waħda mill-pjastri titkellem dwar dandik il-paġnar biċ-ċwievet, ovvjament, mhix omnipotenti - għandha l-limitazzjonijiet tagħha. L-aktar sinifikanti hija li m'għandhiex il-ħila li taqra paġni każwali (nota: b'mod inkonsistenti). Madankollu, fl-era ta 'scrolling bla tarf (nota: fuq in-naħa ta' quddiem), din mhix problema bħal din. L-ispeċifikazzjoni ta' numru tal-paġna biex tikklikkja hija deċiżjoni ħażina fid-disinn tal-UI xorta waħda (nota: opinjoni tal-awtur tal-artiklu).

Xi ngħidu dwar l-għodod?

Il-paġnar fuq iċ-ċwievet ħafna drabi ma jkunx adattat minħabba n-nuqqas ta 'appoġġ strumentali għal dan il-metodu. Il-biċċa l-kbira tal-għodod ta 'żvilupp, inklużi diversi oqfsa, ma jippermettux li tagħżel eżattament kif se titwettaq il-paġnar.

Is-sitwazzjoni hija aggravata mill-fatt li l-metodu deskritt jeħtieġ appoġġ minn tarf sa tarf fit-teknoloġiji użati - mid-DBMS għall-eżekuzzjoni ta 'talba AJAX fil-browser bi scrolling bla tarf. Minflok ma tispeċifika biss in-numru tal-paġna, issa trid tispeċifika sett ta 'ċwievet għall-paġni kollha f'daqqa.

Madankollu, in-numru ta 'oqfsa li jappoġġjaw il-paġnar fuq iċ-ċwievet qed jikber gradwalment. Hawn dak li għandna bħalissa:

(Nota: xi links tneħħew minħabba l-fatt li fiż-żmien tat-traduzzjoni xi libreriji kienu ma ġewx aġġornati mill-2017-2018. Jekk int interessat, tista' tħares lejn is-sors oriġinali.)

Huwa f'dan il-mument li l-għajnuna tiegħek hija meħtieġa. Jekk tiżviluppa jew tappoġġja qafas li jagħmel xi użu mill-paġnar, allura nistaqsi, inħeġġeġ, nitolbok biex tipprovdi appoġġ indiġenu għall-paġnar fuq iċ-ċwievet. Jekk għandek mistoqsijiet jew teħtieġ għajnuna, inkun kuntent li ngħin (il-forum, twitter, formola ta' kuntatt) (nota: mill-esperjenza tiegħi ma' Marcus, nista' ngħid li huwa verament entużjast biex ixerred dan is-suġġett).

Jekk tuża soluzzjonijiet lesti li taħseb li jistħoqqilhom li jkollok appoġġ għall-paġnar biċ-ċwievet, oħloq talba jew saħansitra toffri soluzzjoni lesta, jekk possibbli. Tista 'wkoll link għal dan l-artikolu.

Konklużjoni

Ir-raġuni għaliex approċċ sempliċi u utli bħal paġnar biċ-ċwievet mhuwiex mifrux mhux li huwa diffiċli biex jiġi implimentat teknikament jew jeħtieġ xi sforz kbir. Ir-raġuni ewlenija hija li ħafna huma mdorrijin jaraw u jaħdmu b'offset - dan l-approċċ huwa ddettat mill-istandard innifsu.

Bħala riżultat, ftit nies jaħsbu dwar il-bidla tal-approċċ għall-paġnar, u minħabba dan, appoġġ strumentali minn oqfsa u libreriji qed jiżviluppa ħażin. Għalhekk, jekk l-idea u l-għan ta 'pagination mingħajr offset huma qrib tiegħek, għin biex tifrex!

Sors: https://use-the-index-luke.com/no-offset
Awtur: Markus Winand

Sors: www.habr.com

Żid kumment