விசைகளில் பேஜினேஷனுக்கு உங்களுக்கு ஏன் கருவி ஆதரவு தேவை?

அனைவருக்கும் வணக்கம்! நான் ஜாவா + ஸ்பிரிங்கில் மைக்ரோ சர்வீஸ் எழுதும் பின்தள டெவலப்பர். நான் Tinkoff இல் உள்ள உள் தயாரிப்பு மேம்பாட்டுக் குழு ஒன்றில் பணிபுரிகிறேன்.

விசைகளில் பேஜினேஷனுக்கு உங்களுக்கு ஏன் கருவி ஆதரவு தேவை?

எங்கள் குழுவில், DBMS இல் வினவல்களை மேம்படுத்துவது பற்றிய கேள்வி அடிக்கடி எழுகிறது. நீங்கள் எப்பொழுதும் சற்று வேகமாக இருக்க விரும்புகிறீர்கள், ஆனால் சிந்தனையுடன் கட்டமைக்கப்பட்ட குறியீடுகளை நீங்கள் எப்போதும் பெற முடியாது - நீங்கள் சில தீர்வுகளைத் தேட வேண்டும். தரவுத்தளங்களுடன் பணிபுரியும் போது நியாயமான மேம்படுத்தல்களைத் தேடி வலையில் சுற்றித் திரிந்தபோது, ​​நான் கண்டறிந்தேன் மார்கஸ் வைனண்டின் முடிவில்லாத பயனுள்ள வலைப்பதிவு, SQL செயல்திறன் விளக்கத்தின் ஆசிரியர். இது அரிய வகை வலைப்பதிவு ஆகும், இதில் நீங்கள் அனைத்து கட்டுரைகளையும் வரிசையாக படிக்கலாம்.

உங்களுக்காக மார்கஸின் சிறு கட்டுரையை மொழிபெயர்க்க விரும்புகிறேன். 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- முடிவுகள்.

இந்த அணுகுமுறை சீக் முறை அல்லது கீசெட் பேஜினேஷன் என்று அழைக்கப்படுகிறது. இது மிதக்கும் முடிவு சிக்கலை தீர்க்கிறது (குறிப்பு: முன்பு விவரிக்கப்பட்ட பக்க வாசிப்புகளுக்கு இடையில் எழுதும் சூழ்நிலை) மற்றும், நிச்சயமாக, நாம் அனைவரும் விரும்புவது, இது கிளாசிக் ஆஃப்செட்டை விட வேகமாகவும் நிலையானதாகவும் செயல்படுகிறது. கோரிக்கை செயலாக்க நேரம் கோரப்பட்ட அட்டவணையின் எண்ணிக்கையின் விகிதத்தில் அதிகரிக்காது என்பதில் நிலைத்தன்மை உள்ளது (குறிப்பு: பேஜினேஷனுக்கான வெவ்வேறு அணுகுமுறைகளின் வேலையைப் பற்றி மேலும் அறிய விரும்பினால், உங்களால் முடியும் ஆசிரியரின் விளக்கக்காட்சியைப் பார்க்கவும். வெவ்வேறு முறைகளுக்கான ஒப்பீட்டு அளவுகோல்களையும் நீங்கள் காணலாம்).

ஸ்லைடுகளில் ஒன்று என்று பேசுகிறார்விசைகள் மூலம் pagination, நிச்சயமாக, சர்வ வல்லமை இல்லை - அது அதன் வரம்புகளை கொண்டுள்ளது. மிக முக்கியமான விஷயம் என்னவென்றால், அவளுக்கு சீரற்ற பக்கங்களைப் படிக்கும் திறன் இல்லை (குறிப்பு: சீரற்ற முறையில்). இருப்பினும், முடிவற்ற ஸ்க்ரோலிங் சகாப்தத்தில் (குறிப்பு: முன் முனையில்), இது அப்படிப்பட்ட பிரச்சனை இல்லை. எப்படியும் UI வடிவமைப்பில் கிளிக் செய்வதற்கு பக்க எண்ணைக் குறிப்பிடுவது தவறான முடிவாகும் (குறிப்பு: கட்டுரையின் ஆசிரியரின் கருத்து).

கருவிகளைப் பற்றி என்ன?

இந்த முறைக்கு கருவி ஆதரவு இல்லாததால் விசைகளில் பேஜினேஷன் பெரும்பாலும் பொருந்தாது. பல்வேறு கட்டமைப்புகள் உட்பட பெரும்பாலான மேம்பாட்டுக் கருவிகள், பேஜினேஷன் எப்படிச் செய்யப்படும் என்பதைத் தேர்வுசெய்ய உங்களை அனுமதிக்காது.

விவரிக்கப்பட்ட முறைக்கு பயன்படுத்தப்படும் தொழில்நுட்பங்களில் இறுதி முதல் இறுதி ஆதரவு தேவை என்பதன் மூலம் நிலைமை மோசமடைகிறது - DBMS இலிருந்து முடிவில்லாத ஸ்க்ரோலிங் மூலம் உலாவியில் AJAX கோரிக்கையை செயல்படுத்துவது வரை. பக்க எண்ணைக் குறிப்பிடுவதற்குப் பதிலாக, எல்லாப் பக்கங்களுக்கும் ஒரே நேரத்தில் விசைகளின் தொகுப்பைக் குறிப்பிட வேண்டும்.

இருப்பினும், விசைகளில் பேஜினேஷனை ஆதரிக்கும் கட்டமைப்புகளின் எண்ணிக்கை படிப்படியாக அதிகரித்து வருகிறது. தற்போது எங்களிடம் இருப்பது இங்கே:

(குறிப்பு: மொழிபெயர்ப்பின் போது சில நூலகங்கள் 2017-2018 முதல் புதுப்பிக்கப்படாமல் இருந்ததால் சில இணைப்புகள் அகற்றப்பட்டன. நீங்கள் ஆர்வமாக இருந்தால், அசல் மூலத்தைப் பார்க்கலாம்.)

இந்த தருணத்தில் உங்கள் உதவி தேவை. பேஜினேஷனைப் பயன்படுத்தும் கட்டமைப்பை நீங்கள் உருவாக்கினால் அல்லது ஆதரிக்கிறீர்கள் என்றால், விசைகளில் பேஜினேஷனுக்கு சொந்த ஆதரவை வழங்குமாறு கேட்டுக்கொள்கிறேன், கேட்டுக்கொள்கிறேன். உங்களிடம் கேள்விகள் இருந்தால் அல்லது உதவி தேவைப்பட்டால், நான் உதவ மகிழ்ச்சியாக இருப்பேன் (மன்றம், ட்விட்டர், தொடர்பு படிவம்) (குறிப்பு: மார்கஸுடனான எனது அனுபவத்திலிருந்து, அவர் இந்த தலைப்பை பரப்புவதில் மிகவும் ஆர்வமாக இருக்கிறார் என்று என்னால் கூற முடியும்).

விசைகள் மூலம் பேஜினேஷனுக்கான ஆதரவைப் பெறுவதற்கு தகுதியானவை என்று நீங்கள் கருதும் ஆயத்த தீர்வுகளைப் பயன்படுத்தினால், கோரிக்கையை உருவாக்கவும் அல்லது முடிந்தால், ஆயத்த தீர்வை வழங்கவும். இந்தக் கட்டுரையையும் இணைக்கலாம்.

முடிவுக்கு

விசைகள் மூலம் பேஜினேஷன் போன்ற எளிமையான மற்றும் பயனுள்ள அணுகுமுறை பரவலாக இல்லாததற்குக் காரணம், தொழில்நுட்ப ரீதியாக செயல்படுத்துவது கடினம் அல்லது பெரிய முயற்சி தேவை என்பது அல்ல. முக்கிய காரணம் என்னவென்றால், பலர் ஆஃப்செட் பார்க்கவும் வேலை செய்யவும் பழக்கமாகிவிட்டனர் - இந்த அணுகுமுறை தரநிலையால் கட்டளையிடப்படுகிறது.

இதன் விளைவாக, பேஜினேஷனுக்கான அணுகுமுறையை மாற்றுவது பற்றி சிலர் நினைக்கிறார்கள், இதன் காரணமாக, கட்டமைப்புகள் மற்றும் நூலகங்களிலிருந்து கருவி ஆதரவு மோசமாக வளர்ந்து வருகிறது. எனவே, ஆஃப்செட் இல்லாத பேஜினேஷனின் யோசனையும் குறிக்கோளும் உங்களுக்கு நெருக்கமாக இருந்தால், அதைப் பரப்ப உதவுங்கள்!

ஆதாரம்: https://use-the-index-luke.com/no-offset
ஆசிரியர்: மார்கஸ் வினாண்ட்

ஆதாரம்: www.habr.com

கருத்தைச் சேர்