د څه شی EXPLAIN په اړه خاموش دی او دا څنګه خبرې کول دي

کلاسیک پوښتنه چې یو پراختیا کونکی خپل DBA ته راوړي، یا د سوداګرۍ مالک د PostgreSQL مشاور ته راوړي، نږدې تل ورته غږ کوي: "ولې غوښتنې دومره وخت نیسي چې په ډیټابیس کې بشپړ شي؟"

د دودیزو دلایلو ټولګه:

  • غیر موثر الګوریتم
    کله چې تاسو پریکړه وکړئ چې د څو لسګونو زرو ریکارډونو څخه ډیری CTEs کې شامل شئ
  • پخوانۍ احصایې
    که چیرې په جدول کې د ډیټا ریښتیني توزیع دمخه د تیر ځل تحلیل لخوا راټول شوي څخه خورا توپیر ولري
  • په سرچینو کې "پلگ".
    او اوس د 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 په اړه خاموش دی او دا څنګه خبرې کول دي

په غوښتنه کې د پیرامیټونو ځای په ځای کول

که تاسو پلان ته نه یوازې یوه غوښتنه "ضوابط" کړئ ، بلکه د لاګ د تفصیل لاین څخه د هغې پیرامیټونه هم ، تاسو کولی شئ دا په یوه اختیار کې هم کاپي کړئ:

  • په پوښتنه کې د ارزښت بدیل سره
    ستاسو په اډه کې د مستقیم اجرا کولو او نور پروفایل کولو لپاره

    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

Add a comment