القاعدة الأساسية حول متى يتم استخدام خيار إعادة الترجمة

StackOverflow https://stackoverflow.com/questions/422632

سؤال

أدرك أن خيار "مع إعادة الترجمة" يفرض على المُحسِّن إعادة بناء خطة الاستعلام للعمليات المخزنة، ولكن متى تريد أن يحدث ذلك؟

ما هي بعض القواعد الأساسية حول متى يتم استخدام خيار "مع إعادة الترجمة" ومتى لا يتم ذلك؟

ما هو الحمل الفعال المرتبط بمجرد وضعه على كل sproc؟

هل كانت مفيدة؟

المحلول

وكما قال الآخرون، فأنت لا تريد التضمين ببساطة WITH RECOMPILE في كل عملية مخزنة على سبيل العادة.ومن خلال القيام بذلك، ستتخلص من إحدى الفوائد الأساسية للإجراءات المخزنة:حقيقة أنه يحفظ خطة الاستعلام.

لماذا يحتمل أن يكون هذا مشكلة كبيرة؟يعد حساب خطة الاستعلام أكثر كثافة من تجميع التعليمات البرمجية الإجرائية العادية.لأن بناء جملة عبارة SQL يحدد فقط ماذا تريد، وليس (عموما) كيف للحصول عليها، فإن ذلك يتيح لقاعدة البيانات درجة واسعة من المرونة عند إنشاء الخطة الفعلية (أي الإرشادات خطوة بخطوة لجمع البيانات وتعديلها فعليًا).هناك الكثير من "الحيل" التي يمكن للمعالج المسبق لاستعلام قاعدة البيانات القيام بها والاختيارات التي يمكنه القيام بها - ما هو ترتيب الانضمام إلى الجداول، وما هي الفهارس التي يجب استخدامها، وما إذا كان سيتم تطبيقها WHERE عبارات قبل أو بعد الانضمام، الخ.

بالنسبة لعبارة SELECT بسيطة، قد لا يحدث ذلك فرقًا، ولكن بالنسبة لأي استعلام غير تافه، ستقضي قاعدة البيانات بعض الوقت الجاد (يتم قياسه بالمللي ثانية، بدلاً من الميكروثانية المعتادة) للتوصل إلى خطة مثالية.بالنسبة للاستعلامات المعقدة حقًا، لا يمكنها حتى ضمان وجود أفضل الخطة، يجب عليها فقط استخدام الاستدلال للتوصل إلى جيد جدا يخطط.لذلك، من خلال إجباره على إعادة الترجمة في كل مرة، فإنك تخبره أنه يجب عليه المرور بهذه العملية مرارًا وتكرارًا، حتى لو كانت الخطة التي حصل عليها من قبل جيدة تمامًا.

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

كما هو الحال مع أي شيء متعلق بالأداء، لا تلتقط صورًا في الظلام؛اكتشف الاختناقات التي تكلف 90% من أدائك، وقم بحلها أولاً.

نصائح أخرى

وضعه على كل إجراء مخزن ليست فكرة جيدة، لأن تجميع خطة الاستعلام هو عملية مكلفة نسبيا، وأنك لن ترى أي فائدة من خطط الاستعلام يتم التخزين المؤقت وإعادة استخدامها.

ويمكن التعامل مع حالة حيث شرط الديناميكي تراكمت داخل إجراء مخزن باستخدام sp_executesql لتنفيذ TSQL بدلا من إضافة WITH RECOMPILE إلى الإجراء المخزن.

وهناك حل آخر (SQL خادم عام 2005 فصاعدا) هو استخدام تلميح مع المعلمات محددة باستخدام التلميح OPTIMIZE FOR. هذا يعمل بشكل جيد إذا كانت القيم في الصفوف ثابتة.

لقد قدم SQL سيرفر 2008 و<لأ href = "http://blogs.msdn.com/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server- 2008 feature.aspx "يختلط =" نوفولو noreferrer "> قليلا ميزة يعرف ودعا" OPTIMIZE FOR UNKNOWN ":

<اقتباس فقرة>   

وهذا تلميح يوجه محسن الاستعلام   لاستخدام خوارزميات القياسية لديها   تستخدم دائما إذا أية قيم المعلمات   تم تمريرها إلى الاستعلام على الإطلاق.   في هذه الحالة سوف ننظر محسن   في جميع البيانات الإحصائية المتاحة لل   توصل إلى تحديد ما   قيم المتغيرات المحلية المستخدمة ل   توليد يجب أن يكون queryplan،   بدلا من النظر إلى محددة   قيم المعلمات التي تم تمريرها إلى   الاستعلام عن طريق التطبيق.

والاستخدام الأكثر شيوعا هو عندما قد يكون لديك ديناميكية جملة WHERE في إجراء ... كنت لا تريد أن خطة الاستعلام معينة للحصول على جمعها وحفظها لإعدام اللاحقة لأنها يمكن جدا أن لا يكون الشرط نفسه بالضبط في المرة القادمة يتم استدعاء الإجراء.

وعموما بديل أفضل بكثير لWITH RECOMPILE هو OPTION(RECOMPILE) كما ترون في شرح أدناه، والتي اتخذت من على إجابة لهذا السؤال هنا

<اقتباس فقرة>   

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

     <ع> استخدام WITH إعادة ترجمة يعود لنا على نحو فعال إلى SQL Server 2000   السلوك، حيث معاد الإجراء المخزن بالكامل على كل   تنفيذ. وهناك بديل أفضل، على SQL Server 2005 و في وقت لاحق، هو   استخدام OPTION (إعادة ترجمة) الاستعلام تلميح على مجرد بيان ان   يعاني من مشكلة استنشاق المعلمة. هذا التلميح الاستعلام النتائج   في إعادة تصنيف للبيان إشكالية فقط؛ خطط التنفيذ   بالنسبة للبيانات الأخرى داخل الإجراء المخزن يتم مؤقتا وإعادة استخدامها   كالطبيعي.

     <ع> استخدام WITH إعادة ترجمة يعني أيضا الخطة المعدة لأغراض تخزين   لم يتم مؤقتا الإجراء. ونتيجة لذلك، ليس لديه معلومات الأداء هو   حافظت في DMVs مثل sys.dm_exec_query_stats. عن طريق الاستعلام   بدلا من ذلك يعني إشارة إلى أن خطة تجميع يمكن أن يكون مؤقتا، والأداء   هي المعلومات المتاحة في DMVs (على الرغم من أنه يقتصر على الأكثر   اعدام، لبيان المتضررين فقط).

     

لحالات تشغيل ما لا يقل عن SQL سيرفر 2008 بناء 2746 (الخدمة   حزمة 1 مع التحديث التراكمي 5)، وذلك باستخدام OPTION (إعادة ترجمة) لديه آخر   تفوقا كبيرا على WITH إعادة ترجمة: OPTION فقط (إعادة ترجمة)   تمكن معلمة تضمين الأمثل.

ويجب فقط أن تستخدم عند اختبار مع البيانات reprentative والسياق إثبات أن الاستغناء تنتج خطط الاستعلام غير صالحة (مهما كانت الأسباب المحتملة). لا تفترض مسبقا (دون اختبار) أن SP لن أمثل بشكل صحيح.

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

وانها فرصة أخرى لتعظيم الاستفادة من السابق لأوانه.

ملاحظة: لدي الكثير من النقاط. وإذا قدم أحد نيوباي نفس الجواب أدناه، وأنت توافق، upvote لهم.

scroll top