ڪهڙي EXPLAIN بابت خاموش آهي ۽ ان کي ڪيئن حاصل ڪجي ڳالهائڻ

اهو کلاسک سوال جيڪو هڪ ڊولپر پنهنجي DBA ڏانهن آڻيندو آهي يا هڪ ڪاروبار مالڪ هڪ PostgreSQL صلاحڪار ڏانهن آڻيندو آهي تقريبن هميشه ساڳيو آواز آهي: "درخواستن کي ڊيٽابيس تي مڪمل ٿيڻ ۾ ايترو ڊگهو ڇو آهي؟"

روايتي سببن جو سيٽ:

  • غير موثر الگورتھم
    جڏهن توهان ڪيترن ئي CTEs ۾ شامل ٿيڻ جو فيصلو ڪيو ٿا ته ڪيترن ئي هزارين رڪارڊن تي
  • غير لاڳاپيل انگ اکر
    جيڪڏهن جدول ۾ ڊيٽا جي حقيقي ورڇ اڳ ۾ ئي هڪ کان بلڪل مختلف آهي جيڪا گذريل وقت ANALYZE ذريعي گڏ ڪئي وئي هئي.
  • "پلگ" وسيلن تي
    ۽ هاڻي سي پي يو جي ڪافي وقف ڪيل ڪمپيوٽنگ پاور ناهي، گيگا بائيٽ جي ميموري مسلسل پمپ ڪئي پئي وڃي، يا ڊسڪ ڊيٽابيس جي سڀني "خواهش" سان گڏ نه رهي سگهي.
  • بلاڪ ڪرڻ مقابلي واري عمل کان

۽ جيڪڏهن بلاڪنگ کي پڪڙڻ ۽ تجزيو ڪرڻ تمام ڏکيو آهي، پوء هر شيء لاء اسان کي ضرورت آهي سوال جو منصوبو، جنهن کي استعمال ڪندي حاصل ڪري سگهجي ٿو وضاحت ڪريو آپريٽر (اهو بهتر آهي، يقينا، فوري طور تي وضاحت ڪرڻ (تجزيو، بفرز) ...يا auto_explain module.

پر، جيئن بيان ڪيل ساڳئي دستاويز ۾،

"هڪ منصوبي کي سمجھڻ هڪ فن آهي، ۽ ان ۾ مهارت حاصل ڪرڻ لاء ڪجهه خاص تجربو جي ضرورت آهي ..."

پر توهان ان کان سواء ڪري سگهو ٿا جيڪڏهن توهان صحيح اوزار استعمال ڪريو!

هڪ سوال جو منصوبو عام طور تي ڪهڙو نظر ايندو؟ اهڙو ئي ڪجھہ:

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 بابت خاموش آهي ۽ ان کي ڪيئن حاصل ڪجي ڳالهائڻ

پر جيڪڏهن اهو منصوبو وڌيڪ پيچيده آهي، هو بچاء ۾ اچي ويندو piechart وقت جي تقسيم نوڊس ذريعي:

ڪهڙي 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

تبصرو شامل ڪريو