[تحيات]
(اختر واحد)
[ ] Well trained professional, [ ] Casual reader, [ ] Hapless wanderer,
لدي (ضع علامة على كل ما ينطبق)
[ ] query [ ] stored procedure [ ] database thing maybe
التي كانت تعمل بشكل جيد (إن وجد)
[ ] yesterday [ ] in recent memory [ ] at some point
لكنه أصبح أبطأ فجأة الآن.
لقد تحققت بالفعل للتأكد من عدم حظره ، وأنه ليس ضحية بعض مهام الصيانة أو التقارير أو عمليات أخرى خارج النطاق.
ما هي المشكلة ، وماذا أفعل ، وما هي المعلومات التي يمكنني تقديمها للحصول على بعض المساعدة؟
[*Insert appropriate closing remarks*]
عزيزي [اسمك هنا]!
أوه لا ، أنا آسف لسماع ذلك! لنبدأ ببعض الأساسيات لإصلاحك في لمح البصر.
إنها طريقة للخروج من مشكلة غريبة باروكة. الاسم يتدحرج من اللسان. مثل الكلمة الألمانية للسناجب.
وعادة ما يكون صديقك.
عندما يضرب الاستعلام الخادم الخاص بك ، يجب أن يتم تجميع الخطة. لتوفير الوقت والموارد لاحقًا ، يتم تخزين خطة التنفيذ مؤقتًا استنادًا إلى الصفوف التقديرية التي ستؤدي تلك المعلمة إلى معالجة التعليمات البرمجية وإعادتها.
أسهل طريقة لتصوير هذا الأمر السيئ هي تخيل إجراء مخزن يحتاج إلى حساب الأشياء من مجموعتين غير متوازنتين.
فمثلا:
الأشخاص الذين يرتدون قمصان كروس فيت غير المصابين: صفر
الأشخاص الذين يرتدون قمصان كروس فيت الذين يتجشمون عندما يفسدون: الكل
من الواضح أن تنفيذ هذا الكود يجب أن يقوم بعمل أكثر بكثير من تنفيذ آخر ، وخطط الاستعلام التي تريد القيام بها بكميات مختلفة تمامًا من العمل ستبدو مختلفة تمامًا.
هذه مشكلة يصعب العثور عليها واختبارها وإصلاحها.
في بعض الأحيان ، كل ما تحتاجه هو القليل من الوضوح. أو بالأحرى ، ذاكرة التخزين المؤقت لخطتك.
حاول الجري EXEC sys.sp_recompile @objname = N'schema.procname'
. سيؤدي هذا الإجراء إلى إعادة تجميع خطة جديدة في المرة التالية التي يتم تشغيلها.
ما لن يصلحه هذا:
ما لا يضمنه هذا:
يمكنك أيضًا الإشارة إلى sp_recompile
على طاولة أو عرض ، ولكن يجب تحذيرك من أن جميع التعليمات البرمجية التي تمس ذلك الجدول أو طريقة العرض سيتم إعادة تجميعها. وهذا يمكن أن يجعل المشكلة أصعب بكثير.
عملك أكثر صعوبة. ستحتاج إلى تعقب مقبض SQL. لا تريد تحرير ذاكرة التخزين المؤقت للخطة بالكامل - تمامًا مثل استخدام sp_recompile
مقابل جدول أو عرض ، يمكنك تشغيل (ها ها ها) مجموعة كاملة من العواقب غير المقصودة.
أسهل طريقة لمعرفة هذا الأمر هي تشغيل sp_BlitzWho *! هناك عمود يسمى "تحديد معلمة الإصلاح" يحتوي على أمر لإزالة خطة واحدة من ذاكرة التخزين المؤقت. هذا له نفس العوائق التي تعيد تجميعها ، على الرغم من ذلك.
ما لن يصلحه هذا:
ما لا يضمنه هذا:
سنحتاج إلى الأشياء التالية:
إذا كان الاستعلام قيد التشغيل ، فيمكنك استخدام sp_BlitzWho * أو sp_WhoIsActive لالتقاط الاستعلامات المنفذة حاليًا.
EXEC sp_BlitzWho;
EXEC sp_WhoIsActive @get_plans = 1;
إذا لم يكن الاستعلام قيد التنفيذ حاليًا ، فيمكنك التحقق منه في ذاكرة التخزين المؤقت للخطة ، باستخدام sp_BlitzCache *.
إذا كنت تستخدم SQL Server 2016+ وقمت بتشغيل Query Store ، فيمكنك استخدام sp_BlitzQueryStore *.
EXEC dbo.sp_BlitzCache @StoredProcName = 'Your Mom';
EXEC dbo.sp_BlitzQueryStore @StoredProcName = 'Your Mom';
سوف تساعدك هذه على تعقب النسخة (النسخ) المخبأة من الإجراء المخزن الخاص بك. إذا كانت مجرد معلمة برمجية ، فسيكون البحث أكثر صعوبة. قد يساعد هذا ، على الرغم من:
EXEC dbo.sp_BlitzCache @QueryFilter = 'statement';
يجب أن تشاهد نتائج مماثلة إلى حد ما من أي من تلك. مرة أخرى ، خطة الاستعلام دعوة عمود النقر الأزرق بارد هو صديقك.
أسهل طريقة لمشاركة الخطط هي استخدام Paste The Plan * ، أو تفريغ XML في Pastebin. للحصول على ذلك ، انقر فوق أحد الأعمدة الداعية للنقر الأزرق. يجب أن تظهر خطة الاستعلام الخاصة بك في علامة تبويب SSMS جديدة.
إذا كنت متشوقًا بشأن مشاركة رمز شركتك واستعلامها ، فيمكنك استخدام أداة مستكشف الخطة المجانية لـ Sentry One لإخفاء خطتك. ضع في اعتبارك أن هذا يجعل الحصول على المساعدة أكثر صعوبة - فالشفرة المجهولة أكثر صعوبة في القراءة والاستكشاف.
كل هذه الأدوات التي تحدثنا عنها يجب أن تُرجع نص الاستعلام. لا تحتاج إلى القيام بأي شيء آخر هنا.
الحصول على المعلمة (المعلمات) أكثر صعوبة. إذا كنت تستخدم Plan Explorer ، فهناك علامة تبويب في الأسفل تسردها جميعًا لك.
إذا كنت تستخدم sp_BlitzCache * ، فهناك عمود قابل للنقر يمنحك بيان التنفيذ للإجراءات المخزنة.
يمكنك بسهولة النقر بزر الماوس الأيمن في SSMS لبرمجة الأشياء.
إذا كنت ترغب في الحصول على كل شيء في لقطة واحدة ، فيمكن sp_BlitzIndex * مساعدتك إذا أشرت إليه مباشرةً على طاولة.
EXEC dbo.sp_BlitzIndex @DatabaseName = 'StackOverflow2010',
@SchemaName = 'dbo',
@TableName = 'Users';
سيعطيك هذا تعريف الجدول (وإن لم يكن بمثابة عبارة إنشاء) ، وإنشاء عبارات لجميع الفهارس الخاصة بك.
يجب أن يؤدي جمع هذه المعلومات وإضافتها إلى سؤالك إلى الحصول على معلومات كافية من الأشخاص للمساعدة ، أو توجيهك في الاتجاه الصحيح.
حسنًا ، رائع. انا سعيد لأجلك. أنت شخص مجنون.
هناك الكثير من الطرق التي يعتقد الناس أنها تعمل على "إصلاح" التعرف على معلمة:
ولكن هذه بالفعل تعطل استنشاق المعلمات بطرق مختلفة. هذا لا يعني أنهم لا يستطيعون حل المشكلة ، فهم لا يصلون بالفعل إلى السبب الجذري.
ذلك لأن الوصول إلى السبب الجذري عادة ما يكون نوعًا من الصعوبة. عليك أن تبحث عن تلك "مشاكل جودة الخطة" المزعجة.
بدءًا من الخطط السريعة مقابل البطيئة ، ابحث عن الاختلافات مثل:
ابحث أيضًا عن عوامل تشغيل مختلفة تجعل شفرتك حساسة تجاه التعرف على المعلمات:
لا تنغمس كثيرًا في البحث عن المسح الضوئي أو تجزئة الفهرس أو أي من الأشياء التي يقوم الناس بتقليدها والتخلص منها.
عادة ، هناك مشكلة فهرسة أساسية. في بعض الأحيان يحتاج الرمز إلى إعادة كتابة صغيرة.
إذا كنت تريد معرفة المزيد عن استنشاق المعلمات:
بطيء في التطبيق ، سريع في SSMS؟ - إيرلاند سومارسكوج
لماذا تضبط الإجراءات المخزنة بشكل خاطئ (المشكلة مع المتغيرات المحلية) - كندرا ليتل
كيفية استخدام المعلمات مثل الأداء الاحترافي وتعزيز - Guy Glantser
معلمة التنصت والتضمين وخيارات RECOMPILE - بول وايت
إذا كنت تقرأ هذا ، وتعتقد أن فاتني رابط أو أداة مفيدة ، اترك تعليقًا. سأبذل قصارى جهدي لإبقاء هذا محدثًا.
لا يعتبر استنشاق المعلمات السبب الوحيد المحتمل لأداء الاستعلام المتغير. قد تظهر أي من الأسباب الشائعة التالية نفس الأعراض:
لا يمكن أن تحدث البنود من 6 إلى 11 في هذه القائمة إلا بعد اتخاذ إجراء صريح. أعتقد أنك قصدت استبعاد تلك ، ولكن في كثير من الأحيان لا يدرك الشخص الذي يواجه التحدي ، أن شخصًا آخر أجرى تغييرات ، وهذا يستحق التحقق قبل الشروع في مسار مسح إدخالات ذاكرة التخزين المؤقت للخطة.
فقط للإضافة إلى الإجابات الموجودة في حال لم تساعد ، عندما تتصرف استفساراتك "فجأة" بشكل مختلف في اليوم التالي ، تحقق:
Reports → Standard Reports → Schema Changes History
.الاحتمال الآخر هو أن فريق البنية التحتية الخاص بك يستخدم أدوات مثل vMotion على VMware و VM الذي يتم نقله إلى مثيل SQL الخاص بك بسلاسة من Host إلى Host دون علم DBA بذلك.
هذه مشكلة حقيقية عندما تكون البنية التحتية الخاصة بك من مصادر خارجية ... لدي كابوس حقيقي معها.