EXPLAIN దేని గురించి మౌనంగా ఉంది మరియు దానిని ఎలా మాట్లాడాలి

డెవలపర్ తన DBAకి లేదా వ్యాపార యజమానికి పోస్ట్‌గ్రెస్‌స్క్యూఎల్ కన్సల్టెంట్‌కి తీసుకువచ్చే క్లాసిక్ ప్రశ్న దాదాపు ఎల్లప్పుడూ ఒకే విధంగా ఉంటుంది: "డేటాబేస్‌లో అభ్యర్థనలు పూర్తి కావడానికి ఎందుకు ఎక్కువ సమయం పడుతుంది?"

సాంప్రదాయ కారణాల సమితి:

  • అసమర్థమైన అల్గోరిథం
    మీరు కొన్ని పదివేల రికార్డుల కంటే అనేక CTEలలో చేరాలని నిర్ణయించుకున్నప్పుడు
  • కాలం చెల్లిన గణాంకాలు
    పట్టికలోని డేటా యొక్క వాస్తవ పంపిణీ ఇప్పటికే చివరిసారి విశ్లేషణ ద్వారా సేకరించిన దాని నుండి చాలా భిన్నంగా ఉంటే
  • వనరులపై "ప్లగ్"
    మరియు CPU యొక్క తగినంత అంకితమైన కంప్యూటింగ్ శక్తి లేదు, గిగాబైట్‌ల మెమరీ నిరంతరం పంప్ చేయబడుతోంది లేదా డిస్క్ డేటాబేస్ యొక్క అన్ని “వాంట్‌లను” కొనసాగించదు.
  • నిరోధించడం పోటీ ప్రక్రియల నుండి

మరియు బ్లాకింగ్‌లను పట్టుకోవడం మరియు విశ్లేషించడం చాలా కష్టం అయితే, మిగతా వాటి కోసం మనకు అవసరం ప్రశ్న ప్రణాళిక, ఉపయోగించి పొందవచ్చు ఆపరేటర్‌ని వివరించండి (వాస్తవానికి, వెంటనే వివరించడం మంచిది (విశ్లేషణ, బఫర్‌లు) ...) లేదా auto_explain మాడ్యూల్.

కానీ, అదే డాక్యుమెంటేషన్‌లో పేర్కొన్నట్లుగా,

"ప్రణాళికను అర్థం చేసుకోవడం ఒక కళ, దానిలో నైపుణ్యం సాధించడానికి కొంత అనుభవం అవసరం..."

కానీ మీరు సరైన సాధనాన్ని ఉపయోగిస్తే అది లేకుండా చేయవచ్చు!

ప్రశ్న ప్రణాళిక సాధారణంగా ఎలా ఉంటుంది? అలాంటిది ఏదో:

Index Scan using pg_class_relname_nsp_index on pg_class (actual time=0.049..0.050 rows=1 loops=1)
  Index Cond: (relname = $1)
  Filter: (oid = $0)
  Buffers: shared hit=4
  InitPlan 1 (returns $0,$1)
    ->  Limit (actual time=0.019..0.020 rows=1 loops=1)
          Buffers: shared hit=1
          ->  Seq Scan on pg_class pg_class_1 (actual time=0.015..0.015 rows=1 loops=1)
                Filter: (relkind = 'r'::"char")
                Rows Removed by Filter: 5
                Buffers: shared hit=1

లేదా ఇలా:

"Append  (cost=868.60..878.95 rows=2 width=233) (actual time=0.024..0.144 rows=2 loops=1)"
"  Buffers: shared hit=3"
"  CTE cl"
"    ->  Seq Scan on pg_class  (cost=0.00..868.60 rows=9972 width=537) (actual time=0.016..0.042 rows=101 loops=1)"
"          Buffers: shared hit=3"
"  ->  Limit  (cost=0.00..0.10 rows=1 width=233) (actual time=0.023..0.024 rows=1 loops=1)"
"        Buffers: shared hit=1"
"        ->  CTE Scan on cl  (cost=0.00..997.20 rows=9972 width=233) (actual time=0.021..0.021 rows=1 loops=1)"
"              Buffers: shared hit=1"
"  ->  Limit  (cost=10.00..10.10 rows=1 width=233) (actual time=0.117..0.118 rows=1 loops=1)"
"        Buffers: shared hit=2"
"        ->  CTE Scan on cl cl_1  (cost=0.00..997.20 rows=9972 width=233) (actual time=0.001..0.104 rows=101 loops=1)"
"              Buffers: shared hit=2"
"Planning Time: 0.634 ms"
"Execution Time: 0.248 ms"

కానీ "షీట్ నుండి" టెక్స్ట్లో ప్లాన్ చదవడం చాలా కష్టం మరియు అస్పష్టంగా ఉంది:

  • నోడ్‌లో ప్రదర్శించబడుతుంది సబ్‌ట్రీ వనరుల ద్వారా మొత్తం
    అంటే, ఒక నిర్దిష్ట నోడ్‌ని అమలు చేయడానికి ఎంత సమయం పట్టింది, లేదా టేబుల్ నుండి ఈ రీడింగ్ ఎంత ఖచ్చితంగా డిస్క్ నుండి డేటాను తీసుకువచ్చింది అని అర్థం చేసుకోవడానికి, మీరు ఒకదాని నుండి మరొకటి తీసివేయాలి
  • నోడ్ సమయం అవసరం లూప్‌ల ద్వారా గుణించండి
    అవును, వ్యవకలనం అనేది "తలలో" చేయవలసిన అత్యంత క్లిష్టమైన ఆపరేషన్ కాదు - అన్నింటికంటే, ఒక నోడ్ యొక్క ఒక అమలు కోసం అమలు సమయం సగటుగా సూచించబడుతుంది మరియు వాటిలో వందల సంఖ్యలో ఉండవచ్చు.
  • బాగా, మరియు ఇవన్నీ కలిసి ప్రధాన ప్రశ్నకు సమాధానం ఇవ్వకుండా నిరోధిస్తాయి - కాబట్టి ఎవరు "బలహీనమైన లింక్"?

మేము మా వందల మంది డెవలపర్‌లకు ఇవన్నీ వివరించడానికి ప్రయత్నించినప్పుడు, బయటి నుండి ఇది ఇలా ఉందని మేము గ్రహించాము:

EXPLAIN దేని గురించి మౌనంగా ఉంది మరియు దానిని ఎలా మాట్లాడాలి

మరియు దీని అర్థం మనకు కావాలి ...

సాధనం

దీనిలో మేము ప్లాన్ మరియు అభ్యర్థన ప్రకారం "ఎవరు నిందించాలి మరియు ఏమి చేయాలి" అని అర్థం చేసుకోవడానికి సహాయపడే అన్ని కీ మెకానిక్‌లను సేకరించడానికి ప్రయత్నించాము. బాగా, మరియు మీ అనుభవంలో కొంత భాగాన్ని సంఘంతో పంచుకోండి.
కలవండి మరియు ఉపయోగించండి - వివరించండి.tensor.ru

ప్రణాళికల దృశ్యమానత

ఇలా చూస్తే ప్లాన్ అర్థం చేసుకోవడం తేలికేనా?

Seq Scan on pg_class (actual time=0.009..1.304 rows=6609 loops=1)
  Buffers: shared hit=263
Planning Time: 0.108 ms
Execution Time: 1.800 ms

నిజంగా కాదు.

అయితే ఇలా, సంక్షిప్త రూపంలోకీ సూచికలు వేరు చేయబడినప్పుడు, ఇది చాలా స్పష్టంగా ఉంటుంది:

EXPLAIN దేని గురించి మౌనంగా ఉంది మరియు దానిని ఎలా మాట్లాడాలి

కానీ ప్రణాళిక మరింత క్లిష్టంగా ఉంటే, అతను రక్షించటానికి వస్తాడు పైచార్ట్ సమయం పంపిణీ నోడ్స్ ద్వారా:

EXPLAIN దేని గురించి మౌనంగా ఉంది మరియు దానిని ఎలా మాట్లాడాలి

బాగా, చాలా కష్టమైన ఎంపికల కోసం అతను సహాయం చేయడానికి ఆతురుతలో ఉన్నాడు పురోగతి చార్ట్:

EXPLAIN దేని గురించి మౌనంగా ఉంది మరియు దానిని ఎలా మాట్లాడాలి

ఉదాహరణకు, ఒక ప్రణాళిక ఒకటి కంటే ఎక్కువ వాస్తవ మూలాలను కలిగి ఉన్నప్పుడు చాలా చిన్నవిషయం కాని పరిస్థితులు ఉన్నాయి:

EXPLAIN దేని గురించి మౌనంగా ఉంది మరియు దానిని ఎలా మాట్లాడాలిEXPLAIN దేని గురించి మౌనంగా ఉంది మరియు దానిని ఎలా మాట్లాడాలి

నిర్మాణాత్మక ఆధారాలు

బాగా, ప్రణాళిక యొక్క మొత్తం నిర్మాణం మరియు దాని గొంతు మచ్చలు ఇప్పటికే వేయబడి మరియు కనిపించినట్లయితే, వాటిని డెవలపర్‌కు ఎందుకు హైలైట్ చేయకూడదు మరియు వాటిని "రష్యన్ భాష"లో ఎందుకు వివరించకూడదు?

EXPLAIN దేని గురించి మౌనంగా ఉంది మరియు దానిని ఎలా మాట్లాడాలిమేము ఇప్పటికే ఇటువంటి రెండు డజన్ల సిఫార్సు టెంప్లేట్‌లను సేకరించాము.

లైన్-బై-లైన్ ప్రశ్న ప్రొఫైలర్

ఇప్పుడు, మీరు అసలైన ప్రశ్నను విశ్లేషించిన ప్లాన్‌పై సూపర్‌ఇంపోజ్ చేస్తే, ఒక్కో స్టేట్‌మెంట్‌కు ఎంత సమయం వెచ్చించబడిందో మీరు చూడవచ్చు - ఇలాంటివి:

EXPLAIN దేని గురించి మౌనంగా ఉంది మరియు దానిని ఎలా మాట్లాడాలి

...లేదా ఇలా కూడా:

EXPLAIN దేని గురించి మౌనంగా ఉంది మరియు దానిని ఎలా మాట్లాడాలి

అభ్యర్థనలో పారామితులను భర్తీ చేస్తోంది

మీరు ప్లాన్‌కు అభ్యర్థనను మాత్రమే కాకుండా, లాగ్ యొక్క DETAIL లైన్ నుండి దాని పారామితులను కూడా “జోడించినట్లయితే”, మీరు దానిని ఎంపికలలో ఒకదానిలో అదనంగా కాపీ చేయవచ్చు:

  • అభ్యర్థనలో విలువ ప్రత్యామ్నాయంతో
    మీ బేస్ మరియు తదుపరి ప్రొఫైలింగ్‌పై ప్రత్యక్ష అమలు కోసం

    SELECT 'const', 'param'::text;
  • PREPARE/EXECUTE ద్వారా విలువ ప్రత్యామ్నాయంతో
    షెడ్యూలర్ యొక్క పనిని అనుకరించడానికి, పారామెట్రిక్ భాగాన్ని విస్మరించినప్పుడు - ఉదాహరణకు, విభజించబడిన పట్టికలలో పని చేస్తున్నప్పుడు

    DEALLOCATE ALL;
    PREPARE q(text) AS SELECT 'const', $1::text;
    EXECUTE q('param'::text);
    

ప్రణాళికల ఆర్కైవ్

అతికించండి, విశ్లేషించండి, సహోద్యోగులతో పంచుకోండి! ప్లాన్‌లు ఆర్కైవ్ చేయబడి ఉంటాయి మరియు మీరు వాటిని తర్వాత తిరిగి పొందవచ్చు: వివరించండి.tensor.ru/archive

కానీ మీ ప్లాన్‌ని ఇతరులు చూడకూడదనుకుంటే, "ఆర్కైవ్‌లో ప్రచురించవద్దు" బాక్స్‌ను చెక్ చేయడం మర్చిపోవద్దు.

కింది కథనాలలో నేను ప్రణాళికను విశ్లేషించేటప్పుడు తలెత్తే ఇబ్బందులు మరియు నిర్ణయాల గురించి మాట్లాడతాను.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి