SQL الفقراء الإجراء المخزن تنفيذ خطة الأداء المعلمة استنشاق
-
06-07-2019 - |
سؤال
يجب إجراء مخزن يقبل تاريخ الإدخال الذي يتم بعدها تعيين التاريخ الحالي إذا لم يتم تمرير قيمة في:
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'))