හායි
මගේ නම වන්යා සහ මම ජාවා සංවර්ධකයෙක්. මම PostgreSQL සමඟ ගොඩක් වැඩ කරනවා - දත්ත සමුදාය සැකසීම, ව්යුහය ප්රශස්ත කිරීම, කාර්ය සාධනය සහ සති අන්තයේ DBA ටිකක් වාදනය කිරීම.
මෑතකදි මම අපේ microservices වල Database කිහිපයක් පිළිවෙලට කරලා java library එකක් ලිව්වා
වගකීමෙන් යුතුව ඔබ එවන
මම වැඩ කරන PostgreSQL හි ප්රධාන අනුවාදය 10 වේ. මා භාවිතා කරන සියලුම SQL විමසුම් 11 අනුවාදයේ ද පරීක්ෂා කෙරේ. අවම සහය දක්වන අනුවාදය 9.6 වේ.
මුදලටය
ඒ සියල්ල ආරම්භ වූයේ වසරකට පමණ පෙර මට අමුතු තත්වයක් සමඟිනි: නිල් පැහැයෙන් දර්ශකයක් තරඟකාරී ලෙස නිර්මාණය කිරීම දෝෂයකින් අවසන් විය. දර්ශකයම, සුපුරුදු පරිදි, වලංගු නොවන තත්වයක දත්ත ගබඩාවේ පැවතුනි. ලොග් විශ්ලේෂණය හිඟයක් පෙන්නුම් කළේය
ගැටළුව එක - පෙරනිමි වින්යාසය
කෝපි සාදන්නෙකු මත ධාවනය කළ හැකි Postgres පිළිබඳ රූපකයෙන් බොහෝ විට සෑම දෙනාම වෙහෙසට පත්ව ඇත, නමුත් ... පෙරනිමි වින්යාසය සැබවින්ම ප්රශ්න ගණනාවක් මතු කරයි. අවම වශයෙන්, එය අවධානය යොමු කිරීම වටී නඩත්තු_වැඩ_mem, temp_file_limit, ප්රකාශය_කාලය අවසන් වීම и lock_timeout.
අපේ නඩුවේ නඩත්තු_වැඩ_mem පෙරනිමිය 64 MB විය, සහ temp_file_limit 2 GB පමණ දෙයක් - විශාල වගුවක් මත දර්ශකයක් සෑදීමට අපට ප්රමාණවත් මතකයක් නොතිබුණි.
එබැවින්, තුළ pg-දර්ශකය-සෞඛ්යය මම මාලාවක් එකතු කළා
ගැටලුව දෙක - අනුපිටපත් දර්ශක
අපගේ දත්ත සමුදායන් SSD ධාවකයන් මත සජීවී වන අතර අපි භාවිතා කරමු HAබහු දත්ත මධ්යස්ථාන සමඟ වින්යාස කිරීම, ප්රධාන සත්කාරක සහ n- අනුපිටපත් ගණන. තැටි අවකාශය අපට ඉතා වටිනා සම්පතකි; එය කාර්ය සාධනය සහ CPU පරිභෝජනයට වඩා අඩු වැදගත්කමක් නැත. එමනිසා, එක් අතකින්, අපට වේගයෙන් කියවීම සඳහා දර්ශක අවශ්ය වන අතර, අනෙක් අතට, දත්ත ගබඩාවේ අනවශ්ය දර්ශක දැකීමට අපට අවශ්ය නැත, මන්ද ඒවා අවකාශය අනුභව කරන අතර දත්ත යාවත්කාලීන කිරීම මන්දගාමී කරයි.
දැන්, සියල්ල යථා තත්ත්වයට පත් කර ඇත
ගැටලුව තුන - ඡේදනය වන දර්ශක
බොහෝ නවක සංවර්ධකයින් තනි තීරුවක් මත දර්ශක නිර්මාණය කරයි. ක්රමක්රමයෙන්, මෙම ව්යාපාරය හොඳින් අත්විඳීමෙන්, මිනිසුන් ඔවුන්ගේ විමසුම් ප්රශස්ත කිරීමට සහ තීරු කිහිපයක් ඇතුළත් වඩාත් සංකීර්ණ දර්ශක එකතු කිරීමට පටන් ගනී. තීරු මත දර්ශක දිස්වන ආකාරය මෙයයි A, A + B., A+B+C සහ යනාදි. මෙම දර්ශකවලින් පළමු දෙක තුනෙන් උපසර්ග වන බැවින් ආරක්ෂිතව ඉවතට විසි කළ හැකිය. මෙය තැටියේ විශාල ඉඩ ප්රමාණයක් ඉතිරි කරන අතර මේ සඳහා රෝග විනිශ්චය ද ඇත
ගැටළුව හතර - දර්ශක නොමැතිව විදේශීය යතුරු
Postgres ඔබට පිටුබලය දර්ශකයක් සඳහන් නොකර විදේශීය යතුරු සීමාවන් නිර්මාණය කිරීමට ඉඩ සලසයි. බොහෝ අවස්ථාවන්හිදී මෙය ගැටළුවක් නොවන අතර, එය ප්රකාශ නොවිය හැක... දැනට...
අපටත් එය එසේම විය: එය යම් වේලාවක කාලසටහනකට අනුව ක්රියාත්මක වන සහ පරීක්ෂණ ඇණවුම්වල දත්ත සමුදාය ඉවත් කරන රැකියාවක් ප්රධාන සත්කාරක සමාගම විසින් අපට “එකතු” කිරීමට පටන් ගත්තේය. CPU සහ IO අපතේ ගියේය, ඉල්ලීම් මන්දගාමී විය, කාලය අවසන් විය, සේවාව පන්සියයකි. ඉක්මන් විශ්ලේෂණය
delete from <table> where id in (…)
මෙම අවස්ථාවේදී, ඇත්ත වශයෙන්ම, ඉලක්කගත වගුවේ id මගින් දර්ශකයක් තිබූ අතර, කොන්දේසිය අනුව ඉතා සුළු වාර්තා මකා දමන ලදී. සෑම දෙයක්ම වැඩ කළ යුතු බව පෙනෙන්නට තිබුණත්, අහෝ, එය එසේ නොවීය.
පුදුම එකා පිහිටට ආවා විශ්ලේෂණය පැහැදිලි කරන්න ඉලක්ක වගුවේ වාර්තා මකා දැමීමට අමතරව, යොමු අඛණ්ඩතා පරීක්ෂාවක් ද ඇති බවත්, අදාළ වගු වලින් එකක මෙම චෙක්පත අසාර්ථක වන බවත් පැවසීය. අනුක්රමික ස්කෑන් සුදුසු දර්ශකයක් නොමැතිකම හේතුවෙන්. එබැවින් රෝග විනිශ්චය උපත ලැබීය
පස්වන ගැටළුව - දර්ශකවල ශුන්ය අගය
පෙරනිමියෙන්, Postgres හි btree දර්ශකවල ශුන්ය අගයන් ඇතුළත් වේ, නමුත් ඒවා සාමාන්යයෙන් එහි අවශ්ය නොවේ. එමනිසා, මම මෙම ශූන්ය (රෝග විනිශ්චය) ඉවත දැමීමට උනන්දුවෙන් උත්සාහ කරමි where <A> is not null
. මේ විදියට අපේ එක ඉන්ඩෙක්ස් එකක ප්රමාණය 1877 MB සිට 16 KB දක්වා අඩු කරන්න මට පුළුවන් වුනා. තවද එක් සේවාවක, දර්ශක වලින් ශුන්ය අගයන් බැහැර කිරීම හේතුවෙන් දත්ත සමුදායේ ප්රමාණය 16% කින් (නිරපේක්ෂ සංඛ්යා වලින් 4.3 GB කින්) අඩු විය. ඉතා සරල වෙනස් කිරීම් සමඟ තැටි ඉඩෙහි අතිවිශාල ඉතුරුම්. 🙂
ගැටළුව හය - ප්රාථමික යතුරු නොමැතිකම
යාන්ත්රණයේ ස්වභාවය නිසා
එක් දිනක්, එක් අපූරු සංක්රමණයක් විශාල සහ ක්රියාකාරීව භාවිතා කරන ලද වගුවක සියලුම වාර්තා ගෙන යාවත්කාලීන කරන ලදී. අපි නිල් පාටින් මේසයේ ප්රමාණයට +100 GB ලබා ගත්තෙමු. එය මහත් ලැජ්ජාවකි, නමුත් අපගේ වැරදි ක්රියා එතැනින් අවසන් වූයේ නැත. මෙම මේසයේ ඇති ස්වයංක්රීය රික්තය පැය 15 කට පසුව අවසන් වූ පසු, භෞතික පිහිටීම නැවත නොපැමිණෙන බව පැහැදිලි විය. අපට සේවාව නතර කර VACUUM FULL කිරීමට නොහැකි වූ නිසා අපි භාවිතා කිරීමට තීරණය කළෙමු
පුස්තකාල අනුවාදයේ 0.1.5 වගු සහ දර්ශක වලින් දත්ත රැස් කර නියමිත වේලාවට ප්රතිචාර දැක්වීමේ හැකියාව එකතු කර ඇත.
ගැටළු හත සහ අට - ප්රමාණවත් නොවන දර්ශක සහ භාවිතයට නොගත් දර්ශක
පහත රෝග විනිශ්චය දෙක වේ:
මා දැනටමත් ලියා ඇති පරිදි, අපි අනුරූ කිහිපයක් සමඟ වින්යාසයක් භාවිතා කරන අතර විවිධ ධාරකවල කියවීමේ භාරය මූලික වශයෙන් වෙනස් වේ. මෙහි ප්රතිඵලයක් වශයෙන්, සමහර ධාරකවල සමහර වගු සහ දර්ශක ප්රායෝගිකව භාවිතා නොකරන බව තත්වය හැරෙනවා, සහ විශ්ලේෂණය සඳහා ඔබ පොකුරේ සියලුම ධාරකයන්ගෙන් සංඛ්යා ලේඛන එකතු කළ යුතුය.
මෙම ප්රවේශය කිසිදා භාවිතා නොකළ දර්ශක ඉවත් කිරීමෙන් මෙන්ම කලාතුරකින් භාවිතා වන වගු වලට නැතිවූ දර්ශක එකතු කිරීමෙන් ගිගාබයිට් දස කිහිපයක් ඉතිරි කර ගැනීමට අපට ඉඩ සලසයි.
නිගමනය ලෙස
ඇත්ත වශයෙන්ම, සියලුම රෝග විනිශ්චය සඳහා ඔබට වින්යාසගත කළ හැකිය
දත්ත සමුදා සංක්රමණයන් ක්රියාත්මක වූ වහාම ක්රියාකාරී පරීක්ෂණ වලදී සමහර රෝග විනිශ්චය සිදු කළ හැක. මෙය සමහර විට මගේ පුස්තකාලයේ ඇති ප්රබලම අංගයන්ගෙන් එකකි. භාවිතය පිළිබඳ උදාහරණයක් සොයාගත හැකිය
භාවිතයට නොගත් හෝ නැතිවූ දර්ශක සඳහා මෙන්ම, bloat සඳහා චෙක්පත් සැබෑ දත්ත ගබඩාවක පමණක් සිදු කිරීම අර්ථවත් කරයි. එකතු කළ අගයන් සටහන් කළ හැක
මම ඇත්තටම බලාපොරොත්තු වෙනවා pg-දර්ශකය-සෞඛ්යය ප්රයෝජනවත් සහ ඉල්ලුමක් වනු ඇත. ඔබ සොයා ගන්නා ගැටළු වාර්තා කිරීමෙන් සහ නව රෝග විනිශ්චය යෝජනා කිරීමෙන් ඔබට පුස්තකාලයේ සංවර්ධනයට දායක විය හැක.
මූලාශ්රය: www.habr.com