Firwat braucht Dir instrumental Ënnerstëtzung fir Pagination op Schlësselen?

Moien alleguer! Ech sinn e Backend Entwéckler schreiwen Mikroservicer am Java + Fréijoer. Ech schaffen an engem vun den internen Produktentwécklungsteams bei Tinkoff.

Firwat braucht Dir instrumental Ënnerstëtzung fir Pagination op Schlësselen?

An eisem Team stellt sech dacks d'Fro fir Ufroen an engem DBMS ze optimiséieren. Dir wëllt ëmmer e bësse méi séier sinn, awer Dir kënnt net ëmmer mat Duerchduechte konstruéierten Indexen duerchgoen - Dir musst no e puer Léisunge sichen. Wärend engem vun dëse Wanderungen um Internet op der Sich no raisonnabelen Optimisatiounen wann Dir mat Datenbanken schafft, hunn ech fonnt Dem Marcus Wynand säin endlos hëllefräich Blog, Auteur vun SQL Performance Explained. Dëst ass déi selten Aart vu Blog an deem Dir all d'Artikelen an enger Zeil kënnt liesen.

Ech géif gären e kuerzen Artikel vum Marcus fir Iech iwwersetzen. Et kann zu engem gewësse Mooss e Manifest genannt ginn, deen op den alen, awer nach ëmmer relevante Problem vun der Leeschtung vun der Offsetoperatioun no dem SQL Standard opmierksam mécht.

Op e puer Plazen ergänzen ech den Auteur mat Erklärungen a Kommentaren. Ech wäert op all sou Plazen als "ongeféier" bezeechnen. fir méi Kloerheet

Eng kleng Aféierung

Ech denken, datt vill Leit wëssen wéi problematesch a lues ze schaffen mat Säitauswielen iwwer Offset ass. Wousst Dir datt et ganz einfach duerch e méi effizienten Design ersat ka ginn?

Also, d'Offset Schlësselwuert seet d'Datebank fir déi éischt n records an der Ufro ze sprangen. Allerdéngs muss d'Datebank nach ëmmer dës éischt n Opzeechnunge vun der Disk liesen, an der bestëmmter Uerdnung (Notiz: d'Sortéierung gëllen wann et spezifizéiert ass), a nëmmen dann ass et méiglech records vun n+1 un zréckzekommen. Déi interessantst Saach ass datt de Problem net an der spezifescher Ëmsetzung am DBMS ass, mee an der ursprénglecher Definitioun no dem Standard:

...d'Reihen ginn als éischt no der zortéiert an dann limitéiert andeems d'Zuel vun de Reihen, déi an der spezifizéiert sinn, vun Ufank un erofgesat ginn ...
-SQL:2016, Deel 2, 4.15.3 Ofgeleet Dëscher (Notiz: momentan de meescht benotzte Standard)

De Schlësselpunkt hei ass datt d'Offset en eenzege Parameter hëlt - d'Zuel vun de Rekorder fir ze sprangen, an dat ass et. No dëser Definitioun kann den DBMS nëmmen all d'Opzeechnunge recuperéieren an dann déi onnéideg entwerfen. Natierlech forcéiert dës Definitioun vu Offset eis extra Aarbecht ze maachen. An et ass egal ob et SQL oder NoSQL ass.

Just e bësse méi Péng

D'Problemer mat Offset enden net do, an hei ass firwat. Wann, tëscht zwou Säiten vun Daten aus der Disk ze liesen, eng aner Operatioun en neie Rekord setzt, wat geschitt an dësem Fall?

Firwat braucht Dir instrumental Ënnerstëtzung fir Pagination op Schlësselen?

Wann Offset benotzt gëtt fir Rekorder vu fréiere Säiten ze sprangen, an der Situatioun vun engem neie Rekord tëscht Liese vu verschiddene Säiten derbäi, kritt Dir héchstwahrscheinlech Duplikaten (Notiz: dëst ass méiglech wa mir Säit fir Säit liesen mat der Uerdnung no Konstruktioun, dann an der Mëtt vun eisem Output kann et en neien Entrée kréien).

D'Figur weist kloer dës Situatioun. D'Basis liest déi éischt 10 Opzeechnungen, duerno gëtt en neie Rekord agebaut, deen all Liesrecords ëm 1 kompenséiert. Dann hëlt d'Basis eng nei Säit vun den nächsten 10 Opzeechnungen a fänkt net vun der 11. un, wéi et soll, mee vun der 10., duplizéiert dëse Rekord. Et ginn aner Anomalien verbonne mat der Notzung vun dësem Ausdrock, awer dëst ass am meeschte verbreet.

Wéi mir scho erausfonnt hunn, sinn dëst keng Probleemer vun enger spezifescher DBMS oder hir Implementatiounen. De Problem ass bei der Definitioun vun der Paginatioun no dem SQL Standard. Mir soen der DBMS wéi eng Säit ze sichen oder wéi vill Opzeechnungen ze iwwersprangen. D'Datebank kann esou eng Ufro einfach net optimiséieren, well et ze wéineg Informatioun dofir gëtt.

Et ass och derwäert ze klären datt dëst kee Problem mat engem spezifesche Schlësselwuert ass, mee éischter mat der Semantik vun der Ufro. Et gi verschidde méi Syntaxen déi an hirer problematescher Natur identesch sinn:

  • D'Offset Schlësselwuert ass wéi virdru scho gesot.
  • Eng Konstruktioun vun zwee Schlësselwieder Limit [Offset] (obwuel Limit selwer net sou schlecht ass).
  • Filteren no ënnen Grenzen, baséiert op Zeilenummeréierung (zum Beispill row_number (), rownum, etc.).

All dës Ausdréck soen Iech einfach wéivill Zeilen Dir sollt iwwersprangen, keng zousätzlech Informatioun oder Kontext.

Méi spéit an dësem Artikel gëtt d'Offset Schlësselwuert als Resumé vun all dës Optiounen benotzt.

Liewen ouni OFFSET

Loosst eis elo virstellen wéi eis Welt ouni all dës Problemer wier. Et stellt sech eraus datt d'Liewen ouni Offset net sou schwéier ass: mat enger Auswiel kënnt Dir nëmmen déi Reihen auswielen, déi mir nach net gesinn hunn (Notiz: dat ass déi, déi net op der viregter Säit waren), mat enger Bedingung wou.

An dësem Fall, fänken mir aus der Tatsaach, datt wielt op engem bestallt Formatioun ausgefouert ginn (gutt al Uerdnung vun). Well mir e bestallte Set hunn, kënne mir e relativ einfache Filter benotze fir nëmmen d'Donnéeën ze kréien, déi hannert dem leschte Rekord vun der viregter Säit stinn:

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

Dat ass de ganze Prinzip vun dëser Approche. Natierlech ginn d'Saachen méi lëschteg wann Dir no ville Kolonnen zortéiert, awer d'Iddi ass nach ëmmer déiselwecht. Et ass wichteg ze bemierken datt dësen Design fir vill applicabel ass NoSQL-Entscheedungen.

Dës Approche gëtt Sich Method oder Keyset Pagination genannt. Et léist de schwiewend Resultatproblem (Notiz: d'Situatioun mam Schreiwen tëscht Säit liesen, virdru beschriwwen) an, natierlech, wat mir all gär hunn, et funktionnéiert méi séier a méi stabil wéi de klassesche Offset. D'Stabilitéit läit an der Tatsaach, datt d'Veraarbechtungszäit vun der Ufro net am Verhältnis zu der Unzuel vun der ugefrote Dësch eropgeet (Notiz: Wann Dir méi iwwer d'Aarbecht vu verschiddenen Approche fir d'Paginéierung léiere wëllt, kënnt Dir kuckt duerch d'Presentatioun vum Auteur. Dir kënnt och vergläichend Benchmarks fir verschidde Methoden do fannen).

Ee vun de Rutschen schwätzt doriwwerdatt d'Paginéierung duerch Schlësselen natierlech net allmächteg ass - et huet seng Aschränkungen. Déi bedeitendst ass datt si net d'Fäegkeet huet zoufälleg Säiten ze liesen (Notiz: inkonsistent). Wéi och ëmmer, an der Ära vum endlosen Scrollen (Notiz: um Frontend) ass dëst net sou e Problem. Eng Säitnummer ze spezifizéieren fir ze klicken ass souwisou eng schlecht Entscheedung am UI Design (Notiz: Meenung vum Auteur vum Artikel).

Wat iwwer d'Tools?

Paginatioun op Schlësselen ass dacks net gëeegent wéinst dem Mangel u instrumentaler Ënnerstëtzung fir dës Method. Déi meescht Entwécklungsinstrumenter, dorënner verschidde Kaderen, erlaben Iech net genau ze wielen wéi d'Paginéierung ausgefouert gëtt.

D'Situatioun gëtt verschäerft duerch d'Tatsaach datt déi beschriwwe Method Enn-zu-Enn Ënnerstëtzung an den benotzten Technologien erfuerdert - vun der DBMS bis zur Ausféierung vun enger AJAX Ufro am Browser mat endlos Scrollen. Amplaz just d'Säitnummer ze spezifizéieren, musst Dir elo e Set vu Schlësselen fir all Säiten gläichzäiteg uginn.

Wéi och ëmmer, d'Zuel vun de Kaderen déi d'Paginéierung op Schlësselen ënnerstëtzen wiisst graduell. Hei ass wat mir am Moment hunn:

(Notiz: e puer Linke goufen ewechgeholl wéinst der Tatsaach, datt zum Zäitpunkt vun der Iwwersetzung verschidde Bibliothéiken zënter 2017-2018 net aktualiséiert goufen. Wann Dir interesséiert sidd, kënnt Dir d'Originalquell kucken.)

Et ass an dësem Moment datt Är Hëllef gebraucht gëtt. Wann Dir e Kader entwéckelt oder ënnerstëtzt deen e Gebrauch vu Pagination mécht, da froen ech, ech bieden, ech bieden Iech gebierteg Ënnerstëtzung fir Pagination op Schlësselen ze bidden. Wann Dir Froen hutt oder Hëllef braucht, ech hëllefen Iech gären (de Forum, Twitter, Kontakt Form) (Notiz: aus menger Erfahrung mam Marcus kann ech soen datt hien wierklech begeeschtert ass fir dëst Thema ze verbreeden).

Wann Dir fäerdege Léisunge benotzt, déi Dir mengt, et wäert wäert sinn, Ënnerstëtzung fir Paginéierung duerch Schlësselen ze hunn, erstellt eng Ufro oder bitt souguer eng fäerdeg Léisung, wa méiglech. Dir kënnt och op dësen Artikel Link.

Konklusioun

De Grond firwat sou eng einfach an nëtzlech Approche wéi Paginatioun duerch Schlësselen net verbreet ass, ass net datt et schwéier ass technesch ëmzesetzen oder e groussen Effort erfuerdert. Den Haaptgrond ass datt vill Gewunnecht si mat Offset ze gesinn an ze schaffen - dës Approche gëtt vum Standard selwer diktéiert.

Als Resultat denken wéineg Leit drun d'Approche fir d'Paginéierung z'änneren, a wéinst dësem entwéckelt instrumental Ënnerstëtzung vu Kaderen a Bibliothéiken schlecht. Dofir, wann d'Iddi an d'Zil vun der Offset-gratis Paginatioun no bei Iech ass, hëlleft et ze verbreeden!

Source: https://use-the-index-luke.com/no-offset
Auteur: Markus Winand

Source: will.com

Setzt e Commentaire