SQL الفقراء الإجراء المخزن تنفيذ خطة الأداء المعلمة استنشاق

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

سؤال

يجب إجراء مخزن يقبل تاريخ الإدخال الذي يتم بعدها تعيين التاريخ الحالي إذا لم يتم تمرير قيمة في:

CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
AS
    IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
    -- Do Something using @MyDate

أواجه مشاكل فيه إذا كان @MyDate يتم تمريرها في NULL عندما الإجراء المخزن هو أول من جمعه ، وأداء دائما رهيب لجميع قيم الإدخال (NULL أو غير ذلك) ، wheras إذا كان التاريخ / التاريخ الحالي يتم تمريرها في عند الإجراء المخزن هو تجميع أداء جيد من أجل جميع قيم الإدخال (NULL أو خلاف ذلك).

ما هو أيضا الخلط هو أن الفقراء خطة التنفيذ التي يتم إنشاؤها في أمر فظيع حتى عندما تكون قيمة @MyDate المستخدمة هي فعلا NULL (ولا تعيين CURRENT_TIMESTAMP إذا البيان)

لقد اكتشفت أن تعطيل المعلمة استنشاق (عن طريق انتحال المعلمة) إصلاحات مشكلتي:

CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
AS
    DECLARE @MyDate_Copy DATETIME
    SET @MyDate_Copy = @MyDate
    IF @MyDate_Copy IS NULL SET @MyDate_Copy = CURRENT_TIMESTAMP
    -- Do Something using @MyDate_Copy

أعرف أن هذا هو أن تفعل شيئا مع المعلمة استنشاق, ولكن كل من الأمثلة التي رأيتها من "المعلمة استنشاق ذهب سيئة" وقد شملت إجراء مخزن بتجميع مع غير ممثل المعلمة مرت في ذلك هنا أنا أرى أن تنفيذ خطة فظيعة كل تصور القيم التي SQL server قد تعتقد أن المعلمة قد يستغرق عند نقطة حيث يتم تنفيذ العبارة - NULL, CURRENT_TIMESTAMP أو خلاف ذلك.

أي شخص لديه أي فكرة لماذا يحدث هذا ؟

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

المحلول

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

في SQL Server 2008 يمكنك استخدام OPTIMIZE FOR UNKNOWN.

نصائح أخرى

طريقة واحدة كنت قادرا على الحصول على جميع هذه المشكلة في (SQL Server 2005) بدلا من مجرد اخفاء معالم طريق redeclaring المحلية المعلمات إضافة تلميحات للمحسن الاستعلام.

هنا هو فكرة جيدة بلوق وظيفة أن يتحدث أكثر عن ذلك:المعلمة استنشاق في SqlServer 2005

كنت:الخيار (تحسين (@p = '-1'))

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top