کلاسیک پوښتنه چې یو پراختیا کونکی خپل DBA ته راوړي، یا د سوداګرۍ مالک د PostgreSQL مشاور ته راوړي، نږدې تل ورته غږ کوي: "ولې غوښتنې دومره وخت نیسي چې په ډیټابیس کې بشپړ شي؟"
د دودیزو دلایلو ټولګه:
- غیر موثر الګوریتم
کله چې تاسو پریکړه وکړئ چې د څو لسګونو زرو ریکارډونو څخه ډیری CTEs کې شامل شئ - پخوانۍ احصایې
که چیرې په جدول کې د ډیټا ریښتیني توزیع دمخه د تیر ځل تحلیل لخوا راټول شوي څخه خورا توپیر ولري - په سرچینو کې "پلگ".
او اوس د CPU لپاره کافي وقف شوي کمپیوټري ځواک شتون نلري ، ګیګابایټ حافظه په دوامداره توګه پمپ کیږي ، یا ډیسک نشي کولی د ډیټابیس ټولو "غوښتنو" سره وساتي. - بندول د سیالیو پروسو څخه
او که بلاکونه د نیولو او تحلیل لپاره خورا ستونزمن وي، نو بیا د هرڅه لپاره چې موږ ورته اړتیا لرو د پوښتنې پلان، کوم چې په کارولو سره ترلاسه کیدی شي
مګر، لکه څنګه چې په ورته اسنادو کې ویل شوي،
"د پلان درک کول یو هنر دی، او په دې کې د ماسټرۍ لپاره یو څه تجربه ته اړتیا لري ..."
مګر تاسو کولی شئ پرته له دې ترسره کړئ که تاسو سم وسیله وکاروئ!
د پوښتنې پلان عموما څه ښکاري؟ داسې یو څه:
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"
مګر د "پاڼې څخه" په متن کې د پلان لوستل خورا ستونزمن او ناڅرګند دي:
- په نوډ کې ښودل کیږي مجموعه د فرعي ونې سرچینو لخوا
دا د دې لپاره چې پوه شي چې د یو ځانګړي نوډ اجرا کولو لپاره څومره وخت نیولی ، یا د میز څخه دا لوستل څومره دقیقا له ډیسک څخه ډیټا راوړي ، تاسو اړتیا لرئ په یو ډول یو له بل څخه کم کړئ. - نوډ وخت ته اړتیا لري د لوپس لخوا ضرب کړئ
هو، تخفیف خورا پیچلي عملیات ندي چې باید په "سر" کې ترسره شي - په هرصورت، د اعدام وخت د یو نوډ اعدام لپاره اوسط په توګه ښودل شوی، او په سلګونو یې شتون لري. - ښه، او دا ټول یوځای موږ د اصلي پوښتنې ځوابولو څخه مخنیوی کوي - نو څوک "تر ټولو کمزوری لینک"?
کله چې موږ هڅه وکړه دا ټول زموږ څو سوه پراختیا کونکو ته تشریح کړو، موږ پوهیږو چې له بهر څخه دا یو څه داسې ښکاري:
او دا پدې مانا ده چې موږ اړتیا لرو ...
اوزار
پدې کې موږ هڅه وکړه ټول کلیدي میکانیکونه راټول کړو چې د پلان او غوښتنې سره سم "څوک ملامت دی او څه باید وکړي" په پوهیدو کې مرسته وکړي. ښه، او د ټولنې سره د خپلې تجربې یوه برخه شریکه کړئ.
ملاقات او استعمال -
د پلانونو لید
ایا د پلان پوهیدل اسانه دي کله چې داسې ښکاري؟
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
واقعیا نه.
خو داسې، په لنډ ډولکله چې کلیدي شاخصونه جلا شي، دا خورا روښانه ده:
مګر که پلان ډیر پیچلی وي، هغه به د ژغورنې لپاره راشي د وخت ویش د نوډونو لخوا:
ښه، د خورا ستونزمن انتخابونو لپاره هغه د مرستې لپاره په چټکۍ سره دی د پرمختګ چارټ:
د مثال په توګه، دلته خورا غیر معمولي حالتونه شتون لري کله چې یو پالن ممکن له یو څخه زیات ریښتینې ریښې ولري:
ساختماني نښې
ښه، که د پلان ټول جوړښت او د هغې ضعیف ټکي لا دمخه ایښودل شوي او لیدل کیږي، نو ولې یې پراختیا کونکي ته روښانه نه کړئ او په "روسي ژبه" کې یې تشریح کړئ؟
موږ دمخه یو څو درجن ورته سپارښتنې ټیمپلیټونه راټول کړي دي.
د کرښې په واسطه د پوښتنې پروفایلر
اوس، که تاسو اصلي پوښتنه په تحلیل شوي پلان کې واچوئ، تاسو کولی شئ وګورئ چې په هر انفرادي بیان کې څومره وخت مصرف شوی - یو څه داسې:
یا حتی د دې په څیر:
په غوښتنه کې د پیرامیټونو ځای په ځای کول
که تاسو پلان ته نه یوازې یوه غوښتنه "ضوابط" کړئ ، بلکه د لاګ د تفصیل لاین څخه د هغې پیرامیټونه هم ، تاسو کولی شئ دا په یوه اختیار کې هم کاپي کړئ:
- په پوښتنه کې د ارزښت بدیل سره
ستاسو په اډه کې د مستقیم اجرا کولو او نور پروفایل کولو لپارهSELECT 'const', 'param'::text;
- د PREPARE/EXECUTE له لارې د ارزښت بدیل سره
د مهالویش کار تقلید کولو لپاره ، کله چې پیرامیټریک برخه له پامه غورځول کیدی شي - د مثال په توګه ، کله چې په ویشل شوي میزونو کار کولDEALLOCATE ALL; PREPARE q(text) AS SELECT 'const', $1::text; EXECUTE q('param'::text);
د پلانونو آرشیف
پیسټ، تحلیل، د همکارانو سره شریک کړئ! پلانونه به آرشیف پاتې شي او تاسو کولی شئ وروسته بیرته دوی ته ورشئ:
مګر که تاسو نه غواړئ نور ستاسو پلان وګوري، مه هیروئ چې "په آرشیف کې مه خپروئ" بکس چیک کړئ.
په لاندې مقالو کې به زه د هغه ستونزو او پریکړو په اړه وغږیږم چې د پلان تحلیل کولو پرمهال رامینځته کیږي.
سرچینه: www.habr.com