በPostgreSQL ውስጥ ያለው የመረጃ ጠቋሚዎች ጤና በጃቫ ገንቢ እይታ

ሠላም

ስሜ ቫንያ ነው እና እኔ የጃቫ ገንቢ ነኝ። ከ PostgreSQL ጋር ብዙ እሰራለሁ - ዳታቤዙን በማዘጋጀት ፣ አወቃቀሩን ፣ አፈፃፀሙን ማመቻቸት እና ቅዳሜና እሁድ ትንሽ DBA መጫወት።

በቅርብ ጊዜ በእኛ ማይክሮ ሰርቪስ ውስጥ ብዙ የውሂብ ጎታዎችን አስተካክዬ ጃቫ ላይብረሪ ጻፍኩ። pg-index-ጤና, ይህን ስራ ቀላል ያደርገዋል, ጊዜ ይቆጥብልኛል እና በገንቢዎች አንዳንድ የተለመዱ ስህተቶችን እንዳስወግድ ይረዳኛል. ዛሬ የምንነጋገረው ይህ ቤተ-መጽሐፍት ነው.

በPostgreSQL ውስጥ ያለው የመረጃ ጠቋሚዎች ጤና በጃቫ ገንቢ እይታ

ማስተባበያ

እኔ የምሰራው የ PostgreSQL ዋና ስሪት 10 ነው። እኔ የምጠቀምባቸው ሁሉም የSQL መጠይቆች እንዲሁ በስሪት 11 ላይ ተፈትነዋል። የሚደገፈው ዝቅተኛው ስሪት 9.6 ነው።

prehistory

ይህ ሁሉ የጀመረው ከዓመት ገደማ በፊት ለእኔ እንግዳ በሆነ ሁኔታ ነው፡ ከሰማያዊው የወጣ ኢንዴክስ ፉክክር መፍጠር በስህተት አብቅቷል። መረጃ ጠቋሚው ልክ እንደተለመደው በመረጃ ቋቱ ውስጥ ልክ ባልሆነ ሁኔታ ውስጥ ቀርቷል። የምዝግብ ማስታወሻዎች እጥረት መኖሩን አሳይቷል temp_ፋይል_ገደብ. እና እንሄዳለን... በጥልቀት እየቆፈርኩ፣ በዳታቤዝ ውቅረት ውስጥ ሙሉ ችግሮች እንዳሉ አገኘሁ እና እጄን ጠቅልዬ በአይኖቼ ብልጭ ድርግም እያለ መጠገን ጀመርኩ።

ችግር አንድ - ነባሪ ውቅር

ምናልባት ሁሉም ሰው ስለ Postgres ያለውን ዘይቤ በጣም ሰልችቶታል, በቡና ሰሪ ላይ ሊሰራ ይችላል, ግን ... ነባሪ ውቅር በእርግጥ በርካታ ጥያቄዎችን ያስነሳል. ቢያንስ, ትኩረት መስጠት ተገቢ ነው የጥገና_ሥራ_mem, temp_ፋይል_ገደብ, መግለጫ_ጊዜ ማብቂያ и የመቆለፊያ_ጊዜ ማብቂያ.

በእኛ ሁኔታ የጥገና_ሥራ_mem ነባሪ ነበር 64 ሜባ, እና temp_ፋይል_ገደብ በ 2 ጂቢ አካባቢ የሆነ ነገር - በቀላሉ በአንድ ትልቅ ጠረጴዛ ላይ መረጃ ጠቋሚ ለመፍጠር በቂ ማህደረ ትውስታ አልነበረንም.

ስለዚህ ፣ በ pg-index-ጤና ተከታታይ ሰበሰብኩ። ቁልፍ, በእኔ አስተያየት, ለእያንዳንዱ የውሂብ ጎታ መዋቀር ያለባቸው መለኪያዎች.

ችግር ሁለት - የተባዙ ኢንዴክሶች

የእኛ የውሂብ ጎታዎች በኤስኤስዲ ተሽከርካሪዎች ላይ ይኖራሉ, እና እንጠቀማለን HAከበርካታ የውሂብ ማዕከሎች ጋር ማዋቀር, ዋና አስተናጋጅ እና n- የተባዙ ብዛት። የዲስክ ቦታ ለእኛ በጣም ጠቃሚ ምንጭ ነው; ከአፈፃፀም እና ከሲፒዩ ፍጆታ ያነሰ አስፈላጊ አይደለም. ስለዚህ በአንድ በኩል ለፈጣን ንባብ ኢንዴክሶች ያስፈልጉናል በሌላ በኩል ደግሞ በመረጃ ቋቱ ውስጥ አላስፈላጊ ኢንዴክሶችን ማየት አንፈልግም ምክንያቱም ቦታን ይበላሉ እና መረጃን የማዘመን ፍጥነት ይቀንሳል።

እና አሁን ሁሉንም ነገር ወደነበረበት ተመልሷል ልክ ያልሆኑ ኢንዴክሶች እና በቂ አይቻለሁ ዘገባዎች በኦሌግ ባርቱኖቭ"ታላቅ" ማጽዳትን ለማደራጀት ወሰንኩ. ገንቢዎች የውሂብ ጎታ ሰነዶችን ማንበብ እንደማይወዱ ታወቀ። በጣም አይወዱትም. በዚህ ምክንያት, ሁለት የተለመዱ ስህተቶች ይነሳሉ - በዋና ቁልፍ ላይ በእጅ የተፈጠረ ኢንዴክስ እና ልዩ በሆነ አምድ ላይ ተመሳሳይ "በእጅ" ኢንዴክስ. እውነታው ግን አያስፈልጉም - ፖስትግሬስ ሁሉንም ነገር በራሱ ያደርጋል. እንደነዚህ ያሉ ኢንዴክሶች በደህና ሊሰረዙ ይችላሉ, እና ለዚህ ዓላማ ምርመራዎች ታይተዋል የተባዙ_ኢንዴክሶች.

ችግር ሶስት - የተጠላለፉ ኢንዴክሶች

አብዛኞቹ ጀማሪ ገንቢዎች በአንድ አምድ ላይ ኢንዴክሶችን ይፈጥራሉ። ቀስ በቀስ፣ ይህንን ንግድ በደንብ ካጋጠማቸው፣ ሰዎች ጥያቄዎቻቸውን ማመቻቸት እና ብዙ አምዶችን ያካተቱ ውስብስብ ኢንዴክሶችን ማከል ይጀምራሉ። በአምዶች ላይ ኢንዴክሶች በዚህ መንገድ ይታያሉ A, ኤ + ቢ, A + B + C እናም ይቀጥላል. የሦስተኛው ቅድመ ቅጥያ በመሆናቸው የመጀመሪያዎቹ ሁለቱ ኢንዴክሶች በደህና ወደ ውጭ መጣል ይችላሉ። ይህ ደግሞ ብዙ የዲስክ ቦታን ይቆጥባል እና ለዚህም ምርመራዎች አሉ የተጠላለፉ_ኢንዴክሶች.

ችግር አራት - የውጭ ቁልፎች ያለ ኢንዴክሶች

Postgres የድጋፍ መረጃ ጠቋሚን ሳይገልጹ የውጭ ቁልፍ ገደቦችን እንዲፈጥሩ ይፈቅድልዎታል። በብዙ ሁኔታዎች ይህ ችግር አይደለም, እና እራሱን እንኳን ላያሳይ ይችላል ... ለጊዜው ...

ከእኛ ጋር ተመሳሳይ ነበር: ልክ በተወሰነ ጊዜ ውስጥ አንድ ሥራ በጊዜ መርሐግብር መሠረት በመሮጥ እና የውሂብ ጎታውን የሙከራ ትዕዛዞችን በማጽዳት በጌታው አስተናጋጅ "መጨመር" ጀመረ. ሲፒዩ እና አይኦ ወደ ብክነት ሄዱ፣ ጥያቄዎቹ ቀዝቅዘዋል እና ጊዜው አልፏል፣ አገልግሎቱ አምስት መቶ ነበር። ፈጣን ትንተና pg_stat_እንቅስቃሴ የሚሉ ጥያቄዎችን አሳይቷል፡-

delete from <table> where id in (…)

በዚህ አጋጣሚ፣ በእርግጥ፣ በዒላማው ሠንጠረዥ ውስጥ ኢንዴክስ በ መታወቂያ ነበረ፣ እና በጣም ጥቂት መዝገቦች እንደሁኔታው ተሰርዘዋል። ሁሉም ነገር መስራት ያለበት ይመስል ነበር, ግን, ወዮ, አልሰራም.

ድንቁ ወደ መታደግ መጣ ትንታኔን ያብራሩ በዒላማው ሠንጠረዥ ውስጥ መዝገቦችን ከመሰረዝ በተጨማሪ የማጣቀሻ ትክክለኛነት ማረጋገጫም እንዳለ እና ከተዛማጅ ሠንጠረዥ በአንዱ ላይ ይህ ቼክ አልተሳካም ብለዋል ። ተከታታይ ቅኝት ተስማሚ ኢንዴክስ ባለመኖሩ. ስለዚህ ምርመራዎች ተወለደ የውጭ_ቁልፎች_ያለ_ኢንዴክስ.

ችግር አምስት - በመረጃ ጠቋሚዎች ውስጥ ባዶ እሴት

በነባሪ ፣ Postgres በ btree ኢንዴክሶች ውስጥ ባዶ እሴቶችን ያካትታል ፣ ግን ብዙውን ጊዜ እዚያ አያስፈልጉም። ስለዚህ፣ እነዚህን ባዶዎች (ዲያግኖስቲክስ) ለመጣል በትጋት እሞክራለሁ። ኢንዴክሶች_ከኑል_እሴቶች ጋር) ፣ በዓይነት የማይነጣጠሉ ዓምዶች ላይ ከፊል ኢንዴክሶች መፍጠር where <A> is not null. በዚህ መንገድ የአንዱን ኢንዴክሶች መጠን ከ1877 ሜባ ወደ 16 ኪባ መቀነስ ቻልኩ። እና በአንዱ አገልግሎቶች ውስጥ ፣ የመረጃ ቋቱ መጠን በጠቅላላው በ 16% ቀንሷል (በፍፁም ቁጥሮች በ 4.3 ጂቢ) ከመረጃ ጠቋሚዎች ባዶ እሴቶችን በማግለሉ ምክንያት። በጣም ቀላል በሆኑ ማሻሻያዎች በዲስክ ቦታ ላይ ከፍተኛ ቁጠባዎች። 🙂

ችግር ስድስት - ዋና ቁልፎች እጥረት

በአሠራሩ ባህሪ ምክንያት MVCC በ Postgres እንደዚህ ያለ ሁኔታ ሊኖር ይችላል እብጠትበበርካታ የሞቱ መዝገቦች ምክንያት የጠረጴዛዎ መጠን በፍጥነት እያደገ ሲሄድ. ይህ እንደማያስፈራራን፣ ይህ ደግሞ በመሠረታችን ላይ እንደማይሆን በዋህነት አምን ነበር፣ ምክንያቱም፣ ዋው!!!፣ እኛ መደበኛ አልሚዎች ነን... ምንኛ ሞኝ እና የዋህ ነበርኩ...

አንድ ቀን፣ አንድ አስደናቂ ፍልሰት ወስዶ ሁሉንም መዝገቦች በትልቅ እና በንቃት ጥቅም ላይ የዋለ ጠረጴዛ ላይ አዘምኗል። ከሰማያዊው መጠን ወደ ጠረጴዛው መጠን +100 ጂቢ አግኝተናል። በጣም አሳፋሪ ነበር ነገርግን ጉዳታችን በዚህ አላበቃም። በዚህ ጠረጴዛ ላይ ያለው አውቶቫክዩም ከ15 ሰአታት በኋላ ካለቀ በኋላ አካላዊ ቦታው እንደማይመለስ ግልጽ ሆነ። አገልግሎቱን ማቆም እና VACUUM FULL ማድረግ አልቻልንም፣ ስለዚህ ለመጠቀም ወሰንን። pg_repack. እና ከዚያ እንደዚያ ሆነ pg_repack ያለ ዋና ቁልፍ ወይም ሌላ የልዩነት ገደብ ሰንጠረዦችን እንዴት እንደሚሰራ አያውቅም፣ እና የእኛ ጠረጴዛ ዋና ቁልፍ አልነበረውም። ስለዚህ ምርመራዎች ተወለደ ሰንጠረዦች_የሌሉ_ዋና_ቁልፍ.

በቤተ መፃህፍቱ ስሪት ውስጥ 0.1.5 ከጠረጴዛዎች እና ጠቋሚዎች እብጠት መረጃን የመሰብሰብ እና በወቅቱ ምላሽ የመስጠት ችሎታ ተጨምሯል።

ችግሮች ሰባት እና ስምንት - በቂ ያልሆነ ኢንዴክሶች እና ጥቅም ላይ ያልዋሉ ኢንዴክሶች

የሚከተሉት ሁለት ምርመራዎች ናቸው: ሰንጠረዦች_የጠፉ_ኢንዴክሶች и ጥቅም ላይ ያልዋሉ_ኢንዴክሶች - በአንጻራዊ ሁኔታ በቅርብ ጊዜ በመጨረሻው መልክ ታየ። ነጥቡ ብቻ ሊወሰዱ እና ሊጨመሩ አልቻሉም.

አስቀድሜ እንደጻፍኩት, ውቅረትን ከብዙ ቅጂዎች ጋር እንጠቀማለን, እና በተለያዩ አስተናጋጆች ላይ ያለው የንባብ ጭነት በመሠረቱ የተለየ ነው. በውጤቱም, ሁኔታው ​​በአንዳንድ አስተናጋጆች ላይ አንዳንድ ሠንጠረዦች እና ኢንዴክሶች በተግባር ላይ አይውሉም, እና ለመተንተን በሁሉም ስብስቦች ውስጥ ካሉ ሁሉም አስተናጋጆች ስታቲስቲክስን መሰብሰብ ያስፈልግዎታል. ስታቲስቲክስን ዳግም አስጀምር ይህ በክላስተር ውስጥ ባለው እያንዳንዱ አስተናጋጅ ላይም አስፈላጊ ነው ፣ ይህንን በጌታው ላይ ብቻ ማድረግ አይችሉም።

ይህ አካሄድ በጭራሽ ጥቅም ላይ ያልዋሉ ኢንዴክሶችን በማንሳት እንዲሁም የጎደሉትን ኢንዴክሶች በማከል ብዙ አስር ጊጋባይት እንድንቆጥብ አስችሎናል።

እንደ አንድ መደምደሚያ

እርግጥ ነው, ለሁሉም ማለት ይቻላል ምርመራዎችን ማዋቀር ይችላሉ የማግለል ዝርዝር. በዚህ መንገድ አዳዲስ ስህተቶች እንዳይታዩ በመከልከል በመተግበሪያዎ ውስጥ ቼኮችን በፍጥነት መተግበር እና ከዚያ ቀስ በቀስ አሮጌዎችን ማስተካከል ይችላሉ።

አንዳንድ ምርመራዎች የውሂብ ጎታ ፍልሰትን ከለቀቁ በኋላ ወዲያውኑ በተግባራዊ ሙከራዎች ውስጥ ሊከናወኑ ይችላሉ። እና ይህ ምናልባት የእኔ ቤተ-መጽሐፍት በጣም ኃይለኛ ከሆኑት ባህሪያት አንዱ ነው. የአጠቃቀም ምሳሌ በ ውስጥ ይገኛል። ማሳያ.

ጥቅም ላይ ያልዋሉ ወይም የጠፉ ኢንዴክሶችን እንዲሁም እብጠትን በእውነተኛ የውሂብ ጎታ ላይ ብቻ ቼኮችን ማከናወን ምክንያታዊ ነው። የተሰበሰቡት እሴቶች በ ውስጥ ሊመዘገቡ ይችላሉ ጠቅታ ቤት ወይም ወደ ክትትል ስርዓት ተልኳል.

እንደዚያ ተስፋ አደርጋለሁ pg-index-ጤና ጠቃሚ እና በፍላጎት ይሆናል. ያገኟቸውን ችግሮች በማሳወቅ እና አዳዲስ የምርመራ ዘዴዎችን በመጠቆም ለቤተ-መጻህፍት እድገት አስተዋፅኦ ማድረግ ይችላሉ።

ምንጭ: hab.com

አስተያየት ያክሉ