హలో.
నా పేరు వన్య మరియు నేను జావా డెవలపర్ని. నేను PostgreSQLతో చాలా పని చేస్తున్నాను - డేటాబేస్ను సెటప్ చేయడం, నిర్మాణం, పనితీరును ఆప్టిమైజ్ చేయడం మరియు వారాంతాల్లో కొద్దిగా DBA ప్లే చేయడం.
ఇటీవల నేను మా మైక్రోసర్వీస్లో అనేక డేటాబేస్లను చక్కదిద్దాను మరియు జావా లైబ్రరీని వ్రాసాను
నిరాకరణ
నేను పని చేస్తున్న PostgreSQL యొక్క ప్రధాన వెర్షన్ 10. నేను ఉపయోగించే అన్ని SQL ప్రశ్నలు కూడా వెర్షన్ 11లో పరీక్షించబడ్డాయి. కనీస మద్దతు వెర్షన్ 9.6.
పూర్వచరిత్ర
ఇది దాదాపు ఒక సంవత్సరం క్రితం నాకు వింతగా ఉన్న పరిస్థితితో ప్రారంభమైంది: నీలిరంగు నుండి ఇండెక్స్ యొక్క పోటీ సృష్టి లోపంతో ముగిసింది. ఇండెక్స్, ఎప్పటిలాగే, చెల్లని స్థితిలో డేటాబేస్లో ఉంది. లాగ్ విశ్లేషణ కొరతను చూపింది
సమస్య ఒకటి - డిఫాల్ట్ కాన్ఫిగరేషన్
కాఫీ మేకర్లో అమలు చేయగల పోస్ట్గ్రెస్ గురించిన రూపకంతో బహుశా ప్రతి ఒక్కరూ చాలా అలసిపోయారు, కానీ... డిఫాల్ట్ కాన్ఫిగరేషన్ నిజంగా అనేక ప్రశ్నలను లేవనెత్తుతుంది. కనీసం, ఇది దృష్టి పెట్టారు విలువ నిర్వహణ_పని_మెమ్, temp_file_limit, ప్రకటన_సమయం ముగిసింది и లాక్_టైమ్ అవుట్.
మా విషయంలో నిర్వహణ_పని_మెమ్ డిఫాల్ట్ 64 MB, మరియు temp_file_limit 2 GB చుట్టూ ఏదో - పెద్ద టేబుల్పై ఇండెక్స్ని సృష్టించడానికి మాకు తగినంత మెమరీ లేదు.
అందువలన, లో pg-సూచిక-ఆరోగ్యం నేను ఒక సిరీస్ని సేకరించాను
సమస్య రెండు - నకిలీ సూచికలు
మా డేటాబేస్లు SSD డ్రైవ్లలో నివసిస్తాయి మరియు మేము ఉపయోగిస్తాము HA- బహుళ డేటా కేంద్రాలతో కాన్ఫిగరేషన్, మాస్టర్ హోస్ట్ మరియు n- ప్రతిరూపాల సంఖ్య. డిస్క్ స్థలం మాకు చాలా విలువైన వనరు; ఇది పనితీరు మరియు CPU వినియోగం కంటే తక్కువ ముఖ్యమైనది కాదు. అందువల్ల, ఒక వైపు, మనకు వేగంగా చదవడానికి సూచికలు అవసరం, మరియు మరోవైపు, డేటాబేస్లో అనవసరమైన సూచికలను చూడకూడదనుకుంటున్నాము, ఎందుకంటే అవి ఖాళీని తింటాయి మరియు డేటా నవీకరణను నెమ్మదిస్తాయి.
మరియు ఇప్పుడు, ప్రతిదీ పునరుద్ధరించబడింది
సమస్య మూడు - ఖండన సూచికలు
చాలా అనుభవం లేని డెవలపర్లు ఒకే నిలువు వరుసలో సూచికలను సృష్టిస్తారు. క్రమంగా, ఈ వ్యాపారాన్ని పూర్తిగా అనుభవించిన తర్వాత, వ్యక్తులు వారి ప్రశ్నలను ఆప్టిమైజ్ చేయడం మరియు అనేక నిలువు వరుసలను కలిగి ఉన్న మరింత క్లిష్టమైన సూచికలను జోడించడం ప్రారంభిస్తారు. నిలువు వరుసలపై సూచికలు ఈ విధంగా కనిపిస్తాయి A, A + B., A+B+C మరియు అందువలన న. ఈ సూచికలలో మొదటి రెండు సురక్షితంగా విసిరివేయబడతాయి, ఎందుకంటే అవి మూడవది ఉపసర్గలు. ఇది చాలా డిస్క్ స్థలాన్ని కూడా ఆదా చేస్తుంది మరియు దీని కోసం డయాగ్నస్టిక్స్ ఉన్నాయి
సమస్య నాలుగు - సూచికలు లేని విదేశీ కీలు
పోస్ట్గ్రెస్ బ్యాకింగ్ ఇండెక్స్ను పేర్కొనకుండా విదేశీ కీ పరిమితులను సృష్టించడానికి మిమ్మల్ని అనుమతిస్తుంది. అనేక సందర్భాల్లో ఇది సమస్య కాదు, అలాగే కనిపించకపోవచ్చు... ప్రస్తుతానికి...
ఇది మాతో కూడా అలాగే ఉంది: ఏదో ఒక సమయంలో ఒక ఉద్యోగం, షెడ్యూల్ ప్రకారం నడుస్తుంది మరియు పరీక్ష ఆర్డర్ల డేటాబేస్ను క్లియర్ చేయడం మాస్టర్ హోస్ట్ ద్వారా మాకు “జోడించడం” ప్రారంభించింది. CPU మరియు IO వృధాగా పోయాయి, అభ్యర్థనలు మందగించాయి మరియు సమయం ముగిసింది, సేవ ఐదు వందలు. త్వరిత విశ్లేషణ
delete from <table> where id in (…)
ఈ సందర్భంలో, వాస్తవానికి, లక్ష్య పట్టికలో id ద్వారా సూచిక ఉంది మరియు షరతు ప్రకారం చాలా తక్కువ రికార్డ్లు తొలగించబడ్డాయి. ప్రతిదీ పని చేయాలని అనిపించింది, కానీ, అయ్యో, అది చేయలేదు.
అద్భుతమైన వ్యక్తి రక్షించటానికి వచ్చాడు విశ్లేషణను వివరించండి మరియు టార్గెట్ టేబుల్లోని రికార్డులను తొలగించడంతో పాటు, రెఫరెన్షియల్ ఇంటిగ్రిటీ చెక్ కూడా ఉందని, సంబంధిత టేబుల్లలో ఒకదానిలో ఈ చెక్ విఫలమైందని చెప్పారు. వరుస స్కాన్ తగిన సూచిక లేకపోవడం వల్ల. అలా డయాగ్నస్టిక్స్ పుట్టింది
సమస్య ఐదు - సూచికలలో శూన్య విలువ
డిఫాల్ట్గా, పోస్ట్గ్రెస్ బిట్రీ ఇండెక్స్లలో శూన్య విలువలను కలిగి ఉంటుంది, అయితే అవి సాధారణంగా అక్కడ అవసరం లేదు. అందువల్ల, నేను ఈ శూన్యాలను (డయాగ్నస్టిక్స్) విసిరేయడానికి శ్రద్ధగా ప్రయత్నిస్తాను where <A> is not null
. ఈ విధంగా నేను మా ఇండెక్స్లలో ఒకదాని పరిమాణాన్ని 1877 MB నుండి 16 KBకి తగ్గించగలిగాను. మరియు ఒక సేవలో, సూచికల నుండి శూన్య విలువలను మినహాయించడం వల్ల డేటాబేస్ పరిమాణం మొత్తం 16% (సంపూర్ణ సంఖ్యలో 4.3 GB ద్వారా) తగ్గింది. చాలా సులభమైన మార్పులతో డిస్క్ స్థలంలో అపారమైన పొదుపులు. 🙂
సమస్య ఆరు - ప్రాథమిక కీలు లేకపోవడం
యంత్రాంగం యొక్క స్వభావం కారణంగా
ఒక రోజు, ఒక అద్భుతమైన మైగ్రేషన్ పెద్ద మరియు చురుకుగా ఉపయోగించిన పట్టికలోని అన్ని రికార్డులను తీసుకుంది మరియు నవీకరించబడింది. మేము నీలిరంగు నుండి టేబుల్ పరిమాణానికి +100 GBని పొందాము. ఇది చాలా అవమానకరం, కానీ మా దురదృష్టాలు అక్కడితో ముగియలేదు. ఈ టేబుల్పై ఆటోవాక్యూమ్ 15 గంటల తర్వాత ముగిసిన తర్వాత, భౌతిక స్థానం తిరిగి రాదని స్పష్టమైంది. మేము సేవను ఆపివేసి, వాక్యూమ్ని పూర్తి చేయలేకపోయాము, కాబట్టి మేము ఉపయోగించాలని నిర్ణయించుకున్నాము
లైబ్రరీ వెర్షన్లో 0.1.5 బ్లోట్ ఆఫ్ టేబుల్స్ మరియు ఇండెక్స్ల నుండి డేటాను సేకరించే సామర్థ్యం మరియు దానికి సకాలంలో ప్రతిస్పందించే సామర్థ్యం జోడించబడింది.
ఏడు మరియు ఎనిమిది సమస్యలు - సరిపోని సూచికలు మరియు ఉపయోగించని సూచికలు
కింది రెండు రోగనిర్ధారణలు:
నేను ఇప్పటికే వ్రాసినట్లుగా, మేము అనేక ప్రతిరూపాలతో కాన్ఫిగరేషన్ను ఉపయోగిస్తాము మరియు వివిధ హోస్ట్లలో రీడింగ్ లోడ్ ప్రాథమికంగా భిన్నంగా ఉంటుంది. ఫలితంగా, కొన్ని హోస్ట్లపై కొన్ని పట్టికలు మరియు సూచికలు ఆచరణాత్మకంగా ఉపయోగించబడవని పరిస్థితి మారుతుంది మరియు విశ్లేషణ కోసం మీరు క్లస్టర్లోని అన్ని హోస్ట్ల నుండి గణాంకాలను సేకరించాలి.
ఈ విధానం ఎన్నడూ ఉపయోగించని సూచికలను తీసివేయడం ద్వారా అనేక పదుల గిగాబైట్లను ఆదా చేయడానికి మాకు అనుమతి ఇచ్చింది, అలాగే అరుదుగా ఉపయోగించే పట్టికలకు తప్పిపోయిన సూచికలను జోడించడం.
ఒక ముగింపుగా
వాస్తవానికి, దాదాపు అన్ని డయాగ్నస్టిక్స్ కోసం మీరు కాన్ఫిగర్ చేయవచ్చు
డేటాబేస్ మైగ్రేషన్లను విడుదల చేసిన వెంటనే ఫంక్షనల్ పరీక్షలలో కొన్ని డయాగ్నస్టిక్లు నిర్వహించబడతాయి. మరియు ఇది బహుశా నా లైబ్రరీ యొక్క అత్యంత శక్తివంతమైన లక్షణాలలో ఒకటి. ఉపయోగం యొక్క ఉదాహరణలో చూడవచ్చు
నిజమైన డేటాబేస్లో మాత్రమే ఉపయోగించని లేదా తప్పిపోయిన ఇండెక్స్ల కోసం, అలాగే బ్లోట్ కోసం తనిఖీలు చేయడం అర్ధమే. సేకరించిన విలువలను నమోదు చేయవచ్చు
నేను నిజంగా ఆశిస్తున్నాను pg-సూచిక-ఆరోగ్యం ఉపయోగకరంగా మరియు డిమాండ్ ఉంటుంది. మీరు కనుగొన్న సమస్యలను నివేదించడం మరియు కొత్త డయాగ్నస్టిక్లను సూచించడం ద్వారా మీరు లైబ్రరీ అభివృద్ధికి సహకరించవచ్చు.
మూలం: www.habr.com