Ինչու՞ է ձեզ անհրաժեշտ գործիքային աջակցություն ստեղների վրա էջադրելու համար:

Բարեւ բոլորին! Ես backend-ի ծրագրավորող եմ, գրում եմ միկրոծառայություններ Java + Spring-ով: Ես աշխատում եմ Tinkoff-ի ներքին արտադրանքի մշակման թիմերից մեկում:

Ինչու՞ է ձեզ անհրաժեշտ գործիքային աջակցություն ստեղների վրա էջադրելու համար:

Մեր թիմում հաճախ առաջանում է DBMS-ում հարցումների օպտիմալացման հարցը: Դուք միշտ ցանկանում եք մի փոքր ավելի արագ լինել, բայց միշտ չէ, որ կարող եք հաղթահարել մտածված կառուցված ինդեքսները. դուք պետք է փնտրեք որոշ լուծումներ: Համացանցում այս թափառումներից մեկի ժամանակ տվյալների բազաների հետ աշխատելիս ողջամիտ օպտիմալացումներ փնտրելու համար ես գտա Մարկուս Ուայնանդի անվերջ օգտակար բլոգը, SQL Performance Explained-ի հեղինակ: Սա բլոգի այն հազվագյուտ տեսակն է, որտեղ կարող եք անընդմեջ կարդալ բոլոր հոդվածները:

Կցանկանայի ձեզ համար թարգմանել Մարկուսի կարճ հոդվածը։ Այն որոշ չափով կարելի է անվանել մանիֆեստ, որը ձգտում է ուշադրություն հրավիրել SQL ստանդարտի համաձայն օֆսեթ գործողության կատարման հին, բայց դեռ տեղին խնդրի վրա:

Որոշ տեղերում հեղինակին կլրացնեմ բացատրություններով ու մեկնաբանություններով։ Բոլոր նման վայրերը ես կանվանեմ «մոտավորապես»: ավելի հստակության համար

Փոքր ներածություն

Կարծում եմ, շատերը գիտեն, թե որքան խնդրահարույց և դանդաղ է աշխատում էջի ընտրության հետ օֆսեթով: Գիտեի՞ք, որ այն կարելի է բավականին հեշտությամբ փոխարինել ավելի արդյունավետ դիզայնով:

Այսպիսով, օֆսեթ հիմնաբառը տվյալների բազային ասում է բաց թողնել հարցումի առաջին n գրառումները: Այնուամենայնիվ, տվյալների բազան դեռ պետք է կարդալ այս առաջին n գրառումները սկավառակից՝ տրված հերթականությամբ (նշում. կիրառեք տեսակավորումը, եթե այն նշված է), և միայն դրանից հետո հնարավոր կլինի վերադարձնել գրառումները n+1-ից սկսած։ Ամենահետաքրքիրն այն է, որ խնդիրը ոչ թե DBMS-ում կոնկրետ իրականացման մեջ է, այլ սկզբնական սահմանման մեջ՝ ըստ ստանդարտի.

…տողերը սկզբում դասակարգվում են ըստ -ի, այնուհետև սահմանափակվում են՝ սկզբից հանելով նշված տողերի քանակը…
-SQL:2016, Մաս 2, 4.15.3 Ստացված աղյուսակներ (նշում. ներկայումս ամենաշատ օգտագործվող ստանդարտը)

Այստեղ առանցքային կետն այն է, որ օֆսեթը վերցնում է մեկ պարամետր՝ բաց թողնելու գրառումների քանակը, և վերջ: Հետևելով այս սահմանմանը, DBMS-ը կարող է միայն առբերել բոլոր գրառումները, այնուհետև հեռացնել ավելորդները: Ակնհայտ է, որ օֆսեթի այս սահմանումը մեզ ստիպում է լրացուցիչ աշխատանք կատարել: Եվ նույնիսկ նշանակություն չունի՝ դա SQL է, թե NoSQL:

Պարզապես մի փոքր ավելի ցավ

Օֆսեթի հետ կապված խնդիրները դրանով չեն ավարտվում, և ահա թե ինչու: Եթե ​​սկավառակից տվյալների երկու էջ կարդալու միջև մեկ այլ գործողությամբ նոր գրառում է տեղադրվում, ի՞նչ կլինի այս դեպքում:

Ինչու՞ է ձեզ անհրաժեշտ գործիքային աջակցություն ստեղների վրա էջադրելու համար:

Երբ օֆսեթն օգտագործվում է նախորդ էջերից գրառումները բաց թողնելու համար, տարբեր էջերի ընթերցումների միջև նոր գրառում ավելացնելու դեպքում, ամենայն հավանականությամբ, դուք կստանաք կրկնօրինակներ (նշում. դա հնարավոր է, երբ մենք կարդում ենք էջ առ էջ՝ օգտագործելով հերթականությունը ըստ կառուցվածքի, ապա մեր արտադրանքի կեսին այն կարող է ստանալ նոր մուտք):

Նկարը հստակ պատկերում է այս իրավիճակը։ Հիմքը կարդում է առաջին 10 գրառումները, որից հետո տեղադրվում է նոր գրառում, որը բոլոր ընթերցված գրառումները զիջում է 1-ով: Այնուհետև բազան վերցնում է նոր էջ հաջորդ 10 գրառումներից և սկսում է ոչ թե 11-րդից, ինչպես պետք է, այլ 10-րդ՝ կրկնօրինակելով այս ռեկորդը։ Կան այլ անոմալիաներ, որոնք կապված են այս արտահայտության օգտագործման հետ, բայց սա ամենատարածվածն է:

Ինչպես արդեն պարզել ենք, դրանք կոնկրետ DBMS-ի կամ դրանց ներդրման խնդիրներ չեն։ Խնդիրը կայանում է նրանում, որ էջադրումը սահմանվի ըստ SQL ստանդարտի: Մենք DBMS-ին ասում ենք, թե որ էջը պետք է բեռնել կամ քանի գրառում բաց թողնել: Տվյալների բազան պարզապես ի վիճակի չէ օպտիմալացնել նման հարցումը, քանի որ դրա համար շատ քիչ տեղեկատվություն կա:

Արժե նաև պարզաբանել, որ սա կոնկրետ հիմնաբառի խնդիր չէ, այլ հարցման իմաստաբանության հետ կապված: Կան ևս մի քանի շարահյուսություններ, որոնք նույնական են իրենց խնդրահարույց բնույթով.

  • Օֆսեթ հիմնաբառը, ինչպես նշվեց ավելի վաղ:
  • Երկու հիմնաբառերի կառուցումը սահմանում է [օֆսեթ] (չնայած սահմանն ինքնին այնքան էլ վատ չէ):
  • Զտում ըստ ստորին սահմանների՝ հիմնված տողերի համարակալման վրա (օրինակ՝ row_number(), rownum և այլն)։

Այս բոլոր արտահայտությունները պարզապես ասում են ձեզ, թե քանի տող պետք է բաց թողնել, առանց լրացուցիչ տեղեկությունների կամ համատեքստի:

Հետագայում այս հոդվածում օֆսեթ հիմնաբառը օգտագործվում է որպես այս բոլոր տարբերակների ամփոփում:

Կյանքն առանց ՕՖՍԵԹ

Հիմա եկեք պատկերացնենք, թե ինչպիսին կլիներ մեր աշխարհը առանց այս բոլոր խնդիրների: Պարզվում է, որ առանց օֆսեթի կյանքն այնքան էլ դժվար չէ. ընտրովի միջոցով կարող եք ընտրել միայն այն տողերը, որոնք մենք դեռ չենք տեսել (նշել. այսինքն՝ նրանք, որոնք նախորդ էջում չէին)՝ օգտագործելով պայմանը, որտեղ:

Այս դեպքում մենք սկսում ենք նրանից, որ սելեկտները կատարվում են պատվիրված հավաքածուի վրա (հին լավ պատվեր ըստ): Քանի որ մենք ունենք պատվիրված հավաքածու, մենք կարող ենք օգտագործել բավականին պարզ զտիչ՝ ստանալու միայն այն տվյալները, որոնք գտնվում են նախորդ էջի վերջին գրառման հետևում.

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

Սա է այս մոտեցման ողջ սկզբունքը: Իհարկե, ամեն ինչ ավելի զվարճալի է դառնում բազմաթիվ սյունակներով դասավորելիս, բայց գաղափարը դեռ նույնն է: Կարևոր է նշել, որ այս դիզայնը կիրառելի է շատերի համար NoSQL-որոշումները.

Այս մոտեցումը կոչվում է որոնման մեթոդ կամ ստեղնաշարի էջավորում: Այն լուծում է լողացող արդյունքի խնդիրը (նշում. նախկինում նկարագրված էջի ընթերցումների միջև գրելու հետ կապված իրավիճակը) և, իհարկե, այն, ինչ մենք բոլորս սիրում ենք, այն աշխատում է ավելի արագ և կայուն, քան դասական օֆսեթը: Կայունությունը կայանում է նրանում, որ հարցումների մշակման ժամանակը չի ավելանում պահանջվող աղյուսակի քանակին համամասնորեն (նշում. եթե ցանկանում եք ավելին իմանալ էջադրման տարբեր մոտեցումների աշխատանքի մասին, կարող եք. դիտեք հեղինակի ներկայացումը. Այնտեղ կարող եք նաև գտնել տարբեր մեթոդների համեմատական ​​հենանիշներ):

Սլայդներից մեկը խոսում է այդ մասինոր ստեղներով էջավորումն, իհարկե, ամենազոր չէ, այն ունի իր սահմանափակումները։ Ամենակարևորն այն է, որ նա չունի պատահական էջեր կարդալու ունակություն (նշում. անհետևողականորեն): Այնուամենայնիվ, անվերջ ոլորման դարաշրջանում (նշում. առջևի ծայրում), սա նման խնդիր չէ: Սեղմելու համար էջի համար նշելը, այնուամենայնիվ, UI դիզայնում վատ որոշում է (նշում. հոդվածի հեղինակի կարծիքը):

Ինչ վերաբերում է գործիքներին:

Ստեղների վրա էջադրումը հաճախ հարմար չէ այս մեթոդի գործիքային աջակցության բացակայության պատճառով: Զարգացման գործիքների մեծ մասը, ներառյալ տարբեր շրջանակները, թույլ չեն տալիս ընտրել, թե ինչպես է կատարվելու էջադրումը:

Իրավիճակը սրվում է նրանով, որ նկարագրված մեթոդը պահանջում է ծայրից ծայր աջակցություն օգտագործվող տեխնոլոգիաներում՝ DBMS-ից մինչև AJAX հարցումի կատարում բրաուզերում՝ անվերջ պտտելով: Ուղղակի էջի համարը նշելու փոխարեն, այժմ պետք է բոլոր էջերի համար միանգամից մի շարք ստեղներ նշել:

Այնուամենայնիվ, ստեղների վրա էջադրումն աջակցող շրջանակների թիվը աստիճանաբար աճում է: Ահա թե ինչ ունենք այս պահին.

(Նշում. որոշ հղումներ հեռացվել են այն պատճառով, որ թարգմանության պահին որոշ գրադարաններ չեն թարմացվել 2017-2018թթ.-ից: Եթե հետաքրքրված եք, կարող եք նայել սկզբնաղբյուրը:)

Հենց այս պահին անհրաժեշտ է ձեր օգնությունը։ Եթե ​​դուք մշակում կամ աջակցում եք այնպիսի շրջանակ, որն օգտագործում է էջադրում, ապա ես խնդրում եմ, հորդորում եմ, խնդրում եմ ձեզ տրամադրել բնիկ աջակցություն ստեղների վրա էջադրելու համար: Եթե ​​հարցեր ունեք կամ օգնության կարիք ունեք, ես սիրով կօգնեմ (форум, Twitter, կոնտակտային ձև) (նշում. Մարկուսի հետ ունեցած իմ փորձից կարող եմ ասել, որ նա իսկապես ոգևորված է այս թեմայի տարածմամբ)։

Եթե ​​դուք օգտագործում եք պատրաստի լուծումներ, որոնք, ըստ ձեզ, արժանի են ստեղներով էջադրման աջակցություն ունենալուն, ստեղծեք հարցում կամ նույնիսկ առաջարկեք պատրաստի լուծում, եթե հնարավոր է: Կարող եք նաև հղում կատարել այս հոդվածին:

Ամփոփում

Պատճառն այն է, որ նման պարզ և օգտակար մոտեցումը, ինչպիսին է ստեղներով էջավորումը, տարածված չէ, այն չէ, որ այն տեխնիկապես դժվար է իրականացնել կամ մեծ ջանք է պահանջում։ Հիմնական պատճառն այն է, որ շատերը սովոր են տեսնել և աշխատել օֆսեթով. այս մոտեցումը թելադրված է հենց ստանդարտով:

Արդյունքում, քչերն են մտածում էջադրման մոտեցումը փոխելու մասին, և դրա պատճառով շրջանակների և գրադարանների գործիքային աջակցությունը վատ է զարգանում: Հետևաբար, եթե օֆսեթ առանց էջադրման գաղափարն ու նպատակը ձեզ մոտ է, օգնեք տարածել այն:

Source: https://use-the-index-luke.com/no-offset
Հեղինակ՝ Մարկուս Վիանդ

Source: www.habr.com

Добавить комментарий