كيفية جعل أسرع هذا البيان :"paramDate بين startDate NULL"?

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

  •  21-08-2019
  •  | 
  •  

سؤال

هذا الاستعلام هو أخذ وقت طويل عندما endDate باطل (أعتقد أن له حول بيان حالة قبل بيان حالة كان سريع)

SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END) 

ماذا يجب أن تستخدم عندما endDate باطل لجعله أسرع ؟

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

المحلول

وهنا الاستعلام دون CONVERT أو حالة:

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,getdate())

لتأكد من مزود الخدمة doens't تقييم getdate () لكل صف واحد، هل يمكن تخزين ذلك، على الرغم من أنني متأكد من خادم SQL ذكي بما فيه الكفاية افتراضيا:

declare @now datetime
set @now = getdate()

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,@now)

وإرسال الخطة الاستعلام يمكن أن تساعد في تفسير سبب الاستعلام بطيء:

SET SHOWPLAN_TEXT ON
go
SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END)

نصائح أخرى

إذا كان هو الأداء النقدي، ثم ربما فقط لا تستخدم null لفتح نهاية التاريخ - استخدام أقصى دعم التاريخ والوقت بدلا من ذلك (وربما الكثير من 9S)

وكنت أيضا قيام التحويل بشكل منفصل:

DECLARE @when datetime
SET @when = CONVERT(SMALLDATETIME,'21-05-2009',103) 

SELECT * 
  FROM HastaKurumlari
WHERE @when
BETWEEN startDate AND endDate

لا يزال هناك شيئا مختلفا قليلا في أعلاه والخاص الأصلي؛ إذا كنت يمكن أن تفسر <م> نوايا الشيك GETDATE() قد أكون قادرا على مرتبة (اقرأ: الإصلاح) عليه قليلا

.

كنقطة انطلاق ، عامل GETDATE() بحيث دعا مرة واحدة فقط ، و يجب أن نرى تحسنا في سرعة.

بالمناسبة كنت قد كتبت تسألون عن GETDATE() يتم تقييمها في كل مرة enddate باطل.

منذ GETDATE() هو غير القطعية وظيفة الاستعلام لا يمكن أن يكون الأمثل و سوف تميل إلى أداء تحت.

هل يمكن أن تحاول تتجمع وظيفة:

select * 
from HastaKurumlari
where convert(smalldatetime, '21-05-2009', 103) 
    between startDate and coalesce(endDate, getdate());

والطريقة الوحيدة لتكون على يقين من أن يحاول أي بدائل وعرض خطة التنفيذ التي تم إنشاؤها لكل الاستعلام.

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