کس چیز کے بارے میں EXPLAIN خاموش ہے اور اس سے بات کرنے کا طریقہ

کلاسک سوال جو ایک ڈویلپر اپنے DBA کے پاس لاتا ہے یا ایک کاروباری مالک پوسٹگری ایس کیو ایل کنسلٹنٹ کے پاس لاتا ہے تقریبا ہمیشہ ایک ہی لگتا ہے: "درخواستوں کو ڈیٹا بیس پر مکمل ہونے میں اتنا وقت کیوں لگتا ہے؟"

وجوہات کا روایتی مجموعہ:

  • غیر موثر الگورتھم
    جب آپ دسیوں ہزار ریکارڈز پر کئی CTEs میں شامل ہونے کا فیصلہ کرتے ہیں۔
  • پرانے اعدادوشمار
    اگر جدول میں ڈیٹا کی اصل تقسیم پہلے سے ہی پچھلی بار ANALYZE کے جمع کردہ سے بہت مختلف ہے
  • وسائل پر "پلگ"
    اور اب 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 خاموش ہے اور اس سے بات کرنے کا طریقہ

اور اس کا مطلب ہے کہ ہمیں ضرورت ہے...

آلہ۔

اس میں ہم نے تمام کلیدی میکانکس کو اکٹھا کرنے کی کوشش کی جو منصوبہ اور درخواست کے مطابق "کون قصوروار ہے اور کیا کرنا ہے" کو سمجھنے میں مدد کرتے ہیں۔ ٹھیک ہے، اور کمیونٹی کے ساتھ اپنے تجربے کا کچھ حصہ شیئر کریں۔
ملیں اور استعمال کریں - 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);
    

منصوبوں کا ذخیرہ

پیسٹ کریں، تجزیہ کریں، ساتھیوں کے ساتھ اشتراک کریں! منصوبے محفوظ رہیں گے اور آپ بعد میں ان پر واپس جا سکتے ہیں: explain.tensor.ru/archive

لیکن اگر آپ نہیں چاہتے ہیں کہ دوسرے آپ کا منصوبہ دیکھیں تو "آرکائیو میں شائع نہ کریں" باکس کو چیک کرنا نہ بھولیں۔

اگلے مضامین میں میں ان مشکلات اور فیصلوں کے بارے میں بات کروں گا جو کسی منصوبے کا تجزیہ کرتے وقت پیدا ہوتی ہیں۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں