Miks on vajalik instrumentaalne tugi lehekĂŒlgede valimise puhul

Tere kĂ”igile! Ma olen back-end arendaja, kes kirjutab mikroteenuseid Java + Springis. Töödan ĂŒhes ettevĂ”tte Tinkoff sisemiste toodete arendusmeeskondades.

Miks on vajalik instrumentaalne tugi lehekĂŒlgede valimise puhul

Meie meeskonnas tĂ”usetub sageli kĂŒsimus pĂ€ringute optimeerimisest andmebaasides. Alati tahaks natuke kiiremat, kuid mitte alati ei piisa lĂ€bimĂ”eldud indekseerimisest — tuleb leida mingeid alternatiivseid teid. Ühel sellisel rĂ€nnakul internetis, otsides mĂ”istlikke optimeerimisi andmebaasidega töötamiseks, leidsin lĂ”putult kasuliku Markuse Vinandi blogi, kes on raamatu "SQL Performance Explained" autor. See on see haruldane blogitĂŒĂŒp, kus saab jĂ€rjest lugeda kĂ”iki artikleid.

Soovin tĂ”lkida teile vĂ€ikese Markuse artikli. Seda vĂ”ib mingil mÀÀral nimetada manifestiks, mis pĂŒĂŒab juhtida tĂ€helepanu vanale, kuid endiselt aktuaalsele probleemile, mis puudutab SQL standardi offset operatsiooni jĂ”udlust.

MÔnes kohas tÀiendama autori selgitustega ja mÀrkustega. KÔiki selliseid kohti tÀhistan kui "primp" selguse huvides.

LĂŒhike sissejuhatus

Arvan, et paljud teavad, kui probleemne ja aeglane vĂ”ib olla lehekĂŒljepĂ”hine valimine offsetiga. Kas teate, et seda saab ĂŒsna lihtsalt asendada efektiivsema konstruktsiooniga?

Nii et, vÔtmesÔna offset nÀitab andmebaasile, et tuleb jÀtta vÀlja esimesed n kirjet pÀringus. Siiski peab andmebaas kÔik need esimesed n kirjet lugema kettalt, jaotuses, mis on mÀÀratud (primp: rakendage sortimist, kui see on mÀÀratud), ning alles pÀrast seda on vÔimalik tagastada kirjed alates n+1 ja edasi. Huvi pakub, et probleem ei ole konkreetses teostuses andmebaasis, vaid algses mÀÀratlemises standardis:


the rows are first sorted according to the and then limited by dropping the number of rows specified in the from the beginning

-SQL:2016, Part 2, 4.15.3 Derived tables (primp: praegu kÔige kasutatum standard)

Siin on vĂ”tmepunkt see, et offset aktsepteerib ainult ĂŒhte parameetrit — kirjeid, mis tuleb vahele jĂ€tta, ja kĂ”ik. Sellise mÀÀratluse jĂ€rgimine vĂ”imaldab andmebaasil ainult hankida kĂ”ik kirjed ja seejĂ€rel kĂ”rvaldata need, mis ei ole vajalikud. On ilmne, et selline offset’i mÀÀratlemine paneb tegema liigset tööd. Ja siinkohal ei ole oluline, kas see on SQL vĂ”i NoSQL.

Veel natuke valu

Offset probleemid ei piirdu sellega ja siin on pÔhjused. Kui kahe lehe andmete lugemise vahel lisab mÔni teine operatsioon uue kirje, mis sellel juhul juhtub?

Miks on vajalik instrumentaalne tugi lehekĂŒlgede valimise puhul

Kui offset'i kasutatakse, et vahele jÀtta kirjeid eelmistelt lehtedel, siis olukorras, kus uus kirje lisatakse erinevate lehtede lugemise tegevuste vahele, on tÔenÀoliselt tulemuseks dubleeritud kirjed (nt: selline olukord on vÔimalik, kui loeme lehtede kaupa kasutades order by konstruktsiooni, siis vÔib meie tulemuste keskele sattuda uus kirje).

Joonis illustreerib sellist olukorda. Andmebaas loeb esimesed 10 kirjet, pĂ€rast seda lisatakse uus kirje, mis nihutab kĂ”ik loetud kirjed ĂŒhe vĂ”rra. Siis vĂ”tab andmebaas uue lehe 10 jĂ€rgmist kirjet, alustades mitte 11. kirjest, nagu peaks, vaid 10. kirjest, dubleerides selle kirje. On ka teisi anomaaliaid, mis on seotud selle vĂ€ljendi kasutamisega, kuid see on kĂ”ige levinum.

Nagu me juba vĂ€lja selgitasime, ei ole need probleemid konkreetse andmebaasi vĂ”i nende rakenduste probleemid. Probleem seisneb SQL standardi jĂ€rgi lehe mÀÀratlemises. Me ĂŒtlememe andmebaasile, millist lehte on vaja vĂ€lja tĂ”mmata vĂ”i kui palju kirjeid jĂ€tta vahele. Andmebaas ei ole lihtsalt suuteline sellist pĂ€ringut optimeerima, kuna selleks on liiga vĂ€he teavet.

Samuti on oluline mĂ€rkida, et see ei ole konkreetse mĂ€rksĂ”na probleem, vaid pigem pĂ€ringu semantika probleem. On veel mitu identset probleemset sĂŒntaksit:

  • MĂ€rksĂ”na offset, nagu eelnevalt mainitud.
  • Konstruktsioon kahe mĂ€rksĂ”na limit [offset] (kuigi limit iseenesest ei ole nii halb).
  • Filtreerimine alumiste piiride jĂ€rgi, mis pĂ”hineb ridade nummerdamisel (nĂ€iteks row_number(), rownum jne).

KĂ”ik need vĂ€ljendid lihtsalt ĂŒtlevad, kui palju ridu on vaja vahele jĂ€tta, pakkumata mingeid lisainformatsiooni vĂ”i konteksti.

JĂ€tkuvalt kasutatakse kĂ€esolevas artiklis mĂ€rksĂ”na offset ĂŒldistena nende erinevate variantide jaoks.

Elu ilma OFFSETita

Kujutage nĂŒĂŒd ette, milline oleks meie maailm ilma nende probleemideta. Selgub, et elu ilma offset'ita ei ole nii keeruline: saame select'iga valida ainult need read, mida me veel ei ole nĂ€inud (nt: see tĂ€hendab neid, mida ei olnud eelmises lehes), kasutades tingimust where.

Selle juhul lĂ€htume tĂ”siasjast, et valikut teostatakse jĂ€rjestatud hulga (vana hea order by) peal. Kuna meil on jĂ€rjestatud hulk, saame kasutada ĂŒsna lihtsat filtrit, et kuvada ainult need andmed, mis asuvad viimase eelneva lehe kirje taga:

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

See ongi kogu sellise lÀhenemise pÔhimÔte. Muidugi, kui jÀrjestada paljude veergude jÀrgi, muutub see huvitavamaks, kuid idee on endiselt sama. Oluline on mÀrkida, et see konstruktsioon on rakendatav paljudele NoSQL-lahendustele.

Seda lĂ€henemist nimetatakse otsimismeetodiks ehk keyset pagination. See lahendab probleemid ujuva tulemusega (nt: olukord kirje vahel lehtede lugemisel, nagu eelnevalt kirjeldatud) ja, nagu me kĂ”ik armastame, töötab see kiiremini ja stabiilsemalt kui klassikaline offset. Stabiilsus seisneb selles, et pĂ€ringu töötlemise aeg ei suurene proportsionaalselt kĂŒsitava tabeli numbriga (nt: kui soovite rohkem teada erinevate lehe jaotamise lĂ€henemiste toimimisest, saate sirvida autori esitlust. Sealt leiate ka erinevate meetodite vĂ”rdlevad benchmarkid.

Üks slaid rÀÀgib sellest,et lehtede jaotamine vĂ”tmete jĂ€rgi ei ole muidugi kĂ”ikvĂ”imas — tal on oma piirangud. Olulisem on see, et tal ei ole vĂ”imalust lugeda juhuslikke lehti (nt: mittejĂ€rjekindlalt). Siiski, lĂ”putu kerimise ajastul (nt: front-endis) ei ole see probleem. Lehe number klĂ”psamiseks on igal juhul halb lahendus UI arendamisel (nt: autori arvamus).

Ent kuidas on tööriistadega?

KĂŒljendamine vĂ”tmete pĂ”hjal ei sobi sageli tööriistade toetuse puudumise tĂ”ttu. Enamik arendustootest, sealhulgas erinevad raamistike, ei paku valikut, kuidas tĂ€pselt kĂŒljendamine teostatakse.

Situatsiooni sĂŒvendab asjaolu, et kirjeldatud meetod nĂ”uab kasutatavad tehnoloogiad katvat tuge — alates andmebaasist kuni AJAX-pĂ€ringute tĂ€itmiseni brauseris lĂ”putu kerimise korral. Selle asemel, et nĂ€idata ainult lehe numbrit, tuleb nĂŒĂŒd nĂ€idata kĂ”igi lehtede jaoks vĂ”tmete kogumit.

Kuid vÔtmete pÔhjal lehtede jagamist toetavate raamistikute arv kasvab jÀrk-jÀrgult. Siin on, mis on praegu saadaval:

(MĂ€rkus: mĂ”ned lingid on eemaldatud, kuna tĂ”lketĂ€htajal ei olnud mĂ”ned raamatukogud vĂ€rskendatud alates 2017–2018. Kui teid huvitab, vĂ”ite vaadata originaali.)

Just selles punktis on teie abi vajalik. Kui arendate vĂ”i toetate raamistikku, mis mingil viisil kasutab lehtede jagamist, siis palun, ma palun teid, tehke natiivne toetust vĂ”tmete pĂ”hjal lehtede jagamise jaoks. Kui teil on kĂŒsimusi vĂ”i vajate abi, olen rÔÔmuga abiks (a forum, Twitteris, kontaktvorm) (mĂ€rkus: minu kogemuse pĂ”hjal suhtlemisel Markusiga vĂ”in öelda, et ta on tĂ”eliselt entusiastlik selle teema levitamise suhtes).

Kui aga kasutate olemasolevaid lahendusi, mida teie arvates vÀÀrivad vÔtmete pÔhjal lehtede jagamise toetust, siis looge pÀring vÔi isegi pakkuda valmis lahendust, kui see on vÔimalik. VÔite ka viidata sellele artiklile.

KokkuvÔte

PĂ”hjuseks, miks nii lihtne ja kasulik lĂ€henemine nagu vĂ”tmete pĂ”hjal lehtede jagamine pole laialdaselt levinud, ei ole see, et see oleks tehniliselt keeruline vĂ”i nĂ”uaks suuri pingutusi. Peamine pĂ”hjus on see, et paljud on harjunud nĂ€gema ja töötama offsetiga — see lĂ€henemine on dikteeritud standardi endaga.

SeetÔttu ei mÔtle vÀhesed sellele, et muuta lehtede jagamise lÀhenemist, ja seetÔttu areneb raamistikude ja raamatukogude tööriistade tugi nÔrgalt. Seega, kui idee ja eesmÀrk ilma offsetita lehtede jagamise osas on teile lÀhedane, aidake selle levitamist!

Allikas: https://use-the-index-luke.com/no-offset
Autor: Markus Winand

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster