2011-01-25 5 views
0

я выполняю следующий SQL:Как улучшить производительность SQL для этого случая?

Select * from myTable 
where myID =123 
    and myDate >= (case when isnull(null,'')='' then myDate else null end) 

Производительность очень плохо.

Если я могу изменить его так:

Select * from myTable 
where myID =123 
    and myDate >= myDate 

производительность намного лучше.

Мой реальный SQL может быть что-то вроде:

Select * from myTable 
where myID =123 
    and myDate >= (case when isnull(@myDate,'')='' then myDate else null end) 

myDate является Datetime колонка.

Как улучшить производительность для этого случая?

+1

Каковы индексы на myTable? –

+1

почему это? 'isnull (null, '')' – gbn

+0

'производительность намного лучше.' Это потому, что у вас есть предложение dud 'mydate> = mydate', которое на 100% всегда верно – RichardTheKiwi

ответ

0

Если T-SQL, то:

DECLARE @myDate DATETIME 
SET @myDate = NULL 
IF @myDate IS NOT NULL 
BEGIN 
    SELECT * 
    FROM myTable 
    WHERE myID = 123  
    AND myDate >= @myDate 
END 
ELSE 
BEGIN 
    SELECT * 
    FROM myTable 
    WHERE myID = 123  
    AND myDate >= '' 
END 

ELSE Param'd SQL:

SELECT * 
    FROM myTable 
WHERE myID = 123  
    AND (@myDate IS NULL OR myDate >= @myDate) 

EDIT: добавлено НЕ к условию IF.

+0

1. В первом запросе условие IF должно, вероятно, be: 'IF @myDate IS NOT NULL'. 2. Почему второй запрос не может использоваться с T-SQL? –

+0

@Andriy: Исправлено условие IF :) Thx. Что касается второго запроса, он тоже работает в T-SQL. – Chandu

0

Попробуйте

Select * from myTable where myID =123 and (@myDate IS NULL OR myDate IS NULL) 

Если это не достаточно хорошо для вас, добавьте индекс на myDate колонке

0

Первая хорошая новость: вы полюбите COALESCE:

Select * from myTable 
where myID =123 
    and COALESCE(myDate,'') >= @myDate 

Если MyDate является символом, который, как представляется, затем избавляется от этих нулей и заменяется пустыми строками.

... и я предполагаю, что у вас есть составной индекс на (MyId, MyDate)

1

Попробуйте это. Он работает, если myDate не имеет значения NULL.

И, пожалуйста, убедитесь, что MyDate и @myDate имеют одни и те же типы данных

Select * from myTable 
where myID =123 
    and myDate >= isnull(@myDate, myDate) 

Остерегайтесь COALESCE: это может быть demonstratably медленнее ISNULL из-за того, как он обрабатывает типы данных

Смежные вопросы