EXPLAIN எதைப் பற்றி அமைதியாக இருக்கிறது, அதை எப்படிப் பேசுவது

ஒரு டெவலப்பர் தனது DBA அல்லது வணிக உரிமையாளர் ஒரு PostgreSQL ஆலோசகரிடம் கொண்டு வரும் உன்னதமான கேள்வி எப்போதும் ஒரே மாதிரியாக இருக்கும்: "கோரிக்கைகள் தரவுத்தளத்தில் முடிவதற்கு ஏன் இவ்வளவு நேரம் எடுக்கிறது?"

பாரம்பரிய காரணங்களின் தொகுப்பு:

  • திறமையற்ற அல்காரிதம்
    பல்லாயிரக்கணக்கான பதிவுகளில் பல 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

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