ما الذي يشرحه الصمت وكيفية جعله يتحدث

السؤال الكلاسيكي الذي يطرحه المطور على DBA الخاص به أو يطرحه صاحب العمل على مستشار PostgreSQL يبدو دائمًا هو نفسه: "لماذا يستغرق استكمال الطلبات في قاعدة البيانات وقتًا طويلاً؟"

مجموعة الأسباب التقليدية:

  • خوارزمية غير فعالة
    عندما تقرر الانضمام إلى العديد من CTEs عبر بضع عشرات الآلاف من السجلات
  • إحصاءات عفا عليها الزمن
    إذا كان التوزيع الفعلي للبيانات في الجدول مختلفًا تمامًا عن التوزيع الذي تم جمعه بواسطة ANALYZE في المرة الأخيرة
  • "توصيل" الموارد
    ولم تعد هناك قوة حوسبة مخصصة كافية لوحدة المعالجة المركزية، أو يتم ضخ غيغابايت من الذاكرة باستمرار، أو لا يستطيع القرص مواكبة جميع "احتياجات" قاعدة البيانات
  • الحجب من العمليات المتنافسة

وإذا كان من الصعب للغاية التقاط الحجب وتحليله، فسنحتاج إلى كل شيء آخر خطة الاستعلاموالتي يمكن الحصول عليها باستخدام اشرح المشغل (من الأفضل بالطبع أن تشرح على الفور (التحليل والمخازن المؤقتة) ...) أو وحدة الشرح التلقائي.

ولكن كما جاء في نفس الوثائق

"إن فهم الخطة هو فن، وإتقانها يتطلب قدرًا معينًا من الخبرة..."

ولكن يمكنك الاستغناء عنها إذا كنت تستخدم الأداة الصحيحة!

كيف تبدو خطة الاستعلام عادةً؟ شئ مثل هذا:

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;
  • مع استبدال القيمة عبر الإعداد/التنفيذ
    لمحاكاة عمل المجدول، عندما يمكن تجاهل الجزء المعلمي - على سبيل المثال، عند العمل على جداول مقسمة

    DEALLOCATE ALL;
    PREPARE q(text) AS SELECT 'const', $1::text;
    EXECUTE q('param'::text);
    

أرشيف الخطط

لصق وتحليل ومشاركتها مع الزملاء! ستبقى الخطط مؤرشفة ويمكنك العودة إليها لاحقًا: شرح.tensor.ru/archive

ولكن إذا كنت لا تريد أن يرى الآخرون خطتك، فلا تنس تحديد مربع "عدم النشر في الأرشيف".

وفي المقالات التالية سأتحدث عن الصعوبات والقرارات التي تنشأ عند تحليل الخطة.

المصدر: www.habr.com

إضافة تعليق