T-SQL ISNULL () оптимизация

Используя понимание списка

list = [x for x in list if x[-5:] != "smith"]

6
задан OMG Ponies 18 September 2009 в 14:28
поделиться

6 ответов

в этом случае у меня был бы оператор if, проверяющий @due_date_limit

IF (@due_date_limit IS NULL)
BEGIN
    ...
    WHERE   a.is_active = 1 --not required to compare b.due_date <= b.due_date
END
ELSE
BEGIN
    ...
    WHERE   a.is_active = 1
    AND     b.due_date <= @due_date_limit
END
7
ответ дан 8 December 2019 в 13:47
поделиться
AND @due_date_limit IS NULL OR b.due_date <= @due_date_limit

но я не уверен, что это будет намного быстрее.

3
ответ дан 8 December 2019 в 13:47
поделиться

Наиболее частой причиной низкой производительности этого типа запросов является то, что оптимизатор не может быть уверен, какое обычно значение @due_date_limit будет для большинства запросов. Часто план, сгенерированный и повторно используемый при последующих выполнениях, отдает предпочтение случаю, когда значение равно нулю.

Начиная с SQL 2005, вы можете управлять оптимизатором, используя параметр «ОПТИМИЗАЦИЯ ДЛЯ»: -

WHERE a.is_active = 1
AND b.due_date <= ISNULL(@due_date_limit, b.due_date)
OPTION (OPTIMIZE FOR (@due_date_limit = '09/01/2009'))
3
ответ дан 8 December 2019 в 13:47
поделиться

is there an index on due_Date? If not add one and then check the performance. If there already is, then Change to two separate statements

  If @due_date_limit is null
    Select [stuff]
    From Table
  Else
    Select [stuff]
    From Table  
    Where b.due_date <= @due_date_limit

But realize that not filtering (when @due_date_limit is null), or filtering using a <= can potentially return a substantial number of records that will eliminate any opportunity to use an index and will require a complete table scan. This may be what you are experiencing.

2
ответ дан 8 December 2019 в 13:47
поделиться
COALESCE(@due_date_limit, b.due_date)

может помочь

1
ответ дан 8 December 2019 в 13:47
поделиться

@due_date_limit - это переменная хранимой процедуры, поэтому ее можно исключить из этого запроса вместе:

if (@due_date_limit is NULL) 
   <run query that works when @due_date_limit is NULL>
else 
   <run query that works when @due_date_limit is NOT NULL>
1
ответ дан 8 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: