Как улучшить производительность SQL для этого случая? - PullRequest
0 голосов
/ 26 января 2011

Я выдаю следующий 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.

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

Ответы [ 4 ]

1 голос
/ 26 января 2011

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

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

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

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

0 голосов
/ 26 января 2011

Если 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)

РЕДАКТИРОВАТЬ: Добавлено НЕ в условие ЕСЛИ.

0 голосов
/ 26 января 2011

Первая хорошая новость: вам понравится coalesce:

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

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

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

0 голосов
/ 26 января 2011

Попробуйте

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

Если этого недостаточно, добавьте индекс в столбец myDate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...