مرحبا!
في سلسلة من المنشورات ، نود أن نشارك خبرتنا في تطوير وتشغيل أنظمة عائلة MS Dynamics AX (Axapta سابقًا).
معلومات عنا
نحن سلسلة تجزئة صغيرة نسبيًا من محلات السوبر ماركت "Da!" في وقت كتابة هذا التقرير ، لدينا ما يزيد قليلاً عن 100 متجر. تتم أتمتة العمليات الرئيسية لأنشطة تشغيل الشركة في حزمة من أنظمة MS Dynamics Ax 2012 + MS Dynamics 365 FO. تعمل الأنظمة على مدار الساعة طوال أيام الأسبوع. في المتوسط ، يمر حوالي مليون سطر استلام وحوالي 70.000 سطر أوامر تجميع عبر النظام يوميًا.
أدلة الخطة
يمكن ضبط أداء Axapts بطرق مختلفة. الطريقة الأكثر فاعلية ، بالطبع ، هي تحسين كود مصدر التطبيق. لكن هناك حالات يكون فيها هذا مشكلة. ثم يمكنك استخدام الأداة التي يوفرها MS SQL Server DBMS. يطلق عليه دليل الخطة. ظهر في إصدار SQL Server 2005. ولكن وفقًا لمشاعرنا في مجتمع Axapters (خاصةً إذا لم يكن لدى الشركة مسؤول قاعدة بيانات محترف) ، فإنه لا يُعرف ويستخدم دائمًا. على الرغم من أن استخدامه في بعض الحالات يمكن أن يكون فعالًا للغاية.
لاجل ماذا؟
فيما يلي الأسباب الرئيسية التي يجب أن تبحث فيها عن هذه الأداة:
1. بيانات غير متسقة في معلمات الاستعلام. تختلف نتيجة أخذ العينات (عدد السجلات) لنفس معيار أخذ العينات (مجموعة الحقول) اعتمادًا على قيم المتغيرات في معايير أخذ العينات. أو ، بطريقة أبسط ، عندما ينتج عن نفس الاستعلام لمعلمات إدخال مختلفة عددًا مختلفًا تمامًا من السجلات (أحيانًا واحد ، وأحيانًا عشرة آلاف). ويرجع ذلك إلى ما يسمى بـ "استنشاق" معلمات الطلب. عندما يتم إنشاء خطة استعلام مرة واحدة ضمن قناع الاستعلام ، ثم يتم أخذها من ذاكرة التخزين المؤقت. عدم النظر إلى قيم هذه المعلمات نفسها.
هذا هو الحال غالبًا مع الاستعلامات التي تتضمن جداول InventSum و InventDim. على سبيل المثال ، عندما يوجد في التحليلات حزب واحد فقط لبعض الشخصيات ، ولآخرين - عدة آلاف. يمكن أن يمر الطلب الأول لقاعدة البيانات لعنصر تم تعطيل المحاسبة الدفعية له. سيبني المحسن خطة استعلام لذلك. ووضعها في ذاكرة التخزين المؤقت. يمكن أن يمر الطلب التالي لقاعدة البيانات من خلال عنصر تم تمكين المحاسبة الدفعية له. وقدم عدة آلاف من السجلات في اختيار InventSum و InventDim. ولمثل هذه العينة ، لن تكون الخطة من ذاكرة التخزين المؤقت هي الأمثل.
تتمثل إحدى طرق حل هذه المشكلة في استخدام تلميح forceLiterals في نص الطلب. يشير هذا إلى محرك SQL لإنشاء خطة استعلام جديدة في كل مرة. لكن هذا يعطي عبئًا إضافيًا ملموسًا على وحدة المعالجة المركزية. وبنفس الطلبات المتبقية ، فإن استخدام InventDim ليس خيارًا مقبولًا. حسنًا ، عليك أن تفهم أن مُحسِّن SQL Server ليس مثاليًا ، وفي بعض الأحيان ، حتى مع وجود إحصاءات كاملة ، يولد خططًا غريبة.
وفي هذه الحالة ، يأتي دليل الخطة في عملية الإنقاذ ، حيث يمكنك من خلاله اختيار خطة استعلام توفر سرعة تنفيذ مقبولة لأي معلمات إدخال استعلام. وأرفق هذه الخطة بقناع الاستعلام باستخدام دليل الخطة.
2. يختار المحسن فهرسًا ينتج عنه أقفال طويلة. باستخدام دليل الخطة ، يمكنك "تحديد" استخدام مؤشر معين ، والذي سيضيق العينة ويقلل عدد الأقفال.
3. لا يمكن تحديد المصدر (مكان في الكود) لاستعلام المشكلة بسرعة ، ويجب حل مشكلة انخفاض أداء قاعدة البيانات على الفور.
4. لا يمكن تغيير كود مصدر التطبيق لسبب ما (حل الشريك ، طلبات من النواة ، إلخ). هذا ينطبق بشكل خاص على D365 ، الذي يحظر التراكبات.
كيف؟
لن أصف بالتفصيل دليلًا تفصيليًا لإنشاء دليل الخطة. يوجد وصف جيد على موقع البائع (نحن مهتمون بنوع الخطة - SQL) والشبكة بها بحر من البرامج التعليمية.
ولكن من المهم معرفة أن هناك أداة أخرى لـ SQL Server والتي ستكون ذات فائدة كبيرة لك إذا كنت بحاجة إلى إنشاء دليل خطة جديد. يطلق عليه Query Store. ظهرت في عام 2016. وصف مفصل لها هنا .
الفكرة الرئيسية للأداة هي أنه بالإضافة إلى خطة الاستعلام الحالية في ذاكرة التخزين المؤقت ، فإنها تخزن السجل الكامل للخطط التي شكلها المحسن خلال فترة زمنية معينة. إذا كنت تعلم أن الوظيفة الإشكالية عملت "بشكل طبيعي" من قبل. لم تبطئ. عليك فقط العثور على الخطة التي تحتاجها في المستودع وإنشاء دليل خطة بناءً عليها. لسوء الحظ ، نظرًا لخصائص Axapta ، من المستحيل إنشاء دليل خطة باستخدام زر "خطة قوة" واحد. سيتعين عليك نسخ خطة الاستعلام من المستودع وإنشاء دليل الخطة يدويًا. لكن هذا لا يزال يبسط المهمة إلى حد كبير.
يجب أن يؤخذ في الاعتبار أيضًا أن استخدام Query Store يعطي عبءًا صغيرًا على الموارد الحسابية لخادم DBMS المستخدم. لكنها في ممارستنا غير مهمة ، ويمكن إهمال هذا.
أمثلة على
إليك بعض الأمثلة من دليل الخطة من قاعدة المعركة الحقيقية الخاصة بنا. يرجى ملاحظة أن هذه مجرد أمثلة ذات صلة بعمليات أعمالنا المحددة. قد لا تكون قابلة للتطبيق أو حتى ضارة بالتثبيت الخاص بك.
1. InventSum
يحل دليل الخطة هذا مشكلة الخطط دون المستوى الأمثل في حالة الاستعلامات الخاصة بالعناصر التي تحتوي على عدد صغير من السجلات في جدول InventDim. باستخدام هذا الدليل ، يمكنك دائمًا استخدام الخطة المثالية لأخذ العينات مع عدد كبير من مجموعات InventDim SKU. ستكون طلبات البحث عن العناصر التي تحتوي على عدد قليل من وحدات SKU أبطأ قليلاً. لكن هذا ليس ثمنًا كبيرًا يجب دفعه مقابل سرعة ثابتة ويمكن التنبؤ بها لأي مجموعة من معلمات الإدخال.
يتم إنشاء هذه الاستعلامات بشكل أساسي بواسطة أسلوب InventSum :: findSum (). واعتمادًا على التجميع ، قد تختلف أنماط الاستعلام قليلاً. لذلك في الواقع لدينا دليل خطة أكثر تشابهًا ، تم تكييفه مع متغيرات مختلفة من التجمعات.
2. InventSumDelta
يسمح لك دليل الخطة هذا ببناء خطة استعلام مثالية لجدول InventSumDelta ، وتجنب الأقفال غير الضرورية على هذا الجدول. خصوصية هذا الجدول هي أنه لا يتم تخزين البيانات فيه. ولكن تمت إضافتها / إزالتها بشكل مكثف للغاية. إنه في الأساس جدول إشارة. في هذا الصدد ، لا يمكن جمع الإحصاءات العادية في هذا الجدول. لذلك ، قام المُحسِّن أحيانًا بإنشاء خطط دون المستوى الأمثل مما أدى إلى الحظر.
قليلا خارج الموضوع - أيضا لهذا الجدول تحتاج إلى تعطيل تأمين الصفحات على الفهارس. نظرًا لأن التحديد من هذا الجدول يتم دائمًا باستخدام معرف فريد ، فإن تصعيد الأقفال إلى مستوى الصفحة لا معنى له بل إنه ضار هنا.
الاستنتاجات
لكن في الحالة العامة ، اسمحوا لي أن ألفت انتباهكم مرة أخرى ، يجب ألا تسيء استخدام هذه الأداة. إذا تمت كتابة الكود على النحو الأمثل ، يتم تحديث الإحصائيات بانتظام ، ولا تكون الفهارس مجزأة للغاية - سيحدد المحسن في معظم الحالات الخطة الصحيحة نفسها. ولكن إذا تم تكوين دليل الخطة ، فقد تسقط معايير إدخال الطلب بحيث يضر دليل الخطة فقط.