Предпочтительный метод T-SQL, если условие для улучшения повторного использования плана запроса - PullRequest
4 голосов
/ 05 октября 2011

Я хочу понять, что является лучшим методом реализации условия "IF" внутри хранимой процедуры.

Я видел, как этот метод широко используется.Что сравнимо с итеративным кодированием ...

declare @boolExpression bit = 1 --True

if @boolExpression  = 1
  select column from MyTable where group = 10
else
  select column from MyTable where group = 20

Я предпочитаю использовать метод на основе множеств ...

declare @boolExpression bit = 1 --True

select column from MyTable where group = 10 and @boolExpression  =1
union all
select column from MYTable where group = 20 and @boolExpression =0

Я предпочитаю использовать этот метод, потому что, насколько я понимаю, он создаетповторно используемый план запроса и меньший отток кэша плана.Это факт или выдумка?Какой правильный метод использовать.

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

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

Plan 1 screenshot

Второй будет иметь обе ветви как дочерние элементы оператора конкатенации.Фильтры имеют предикат выражения запуска, означающий, что каждый запрос оценивается только при необходимости.

Plan 2 screenshot

0 голосов
/ 05 октября 2011

Вы также можете использовать его следующим образом:

DECLARE @boolExpression BIT = 1

SELECT column FROM MyTable 
WHERE 
    CASE 
        WHEN @boolExpression = 1 THEN 
            CASE 
                WHEN group = 10 THEN 1 
                ELSE 0 
            END 
        ELSE 
            CASE 
                WHEN group = 20 THEN 1 
                ELSE 0 
            END 
    END = 1

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

...