2013-06-19 2 views
2

У меня 2 вопроса о повышении эффективности хранимой процедуры:Как повысить производительность хранимой процедуры?

1) В ЗЕЬЕСТЕ:

,CASE WHEN vatcs.CashDeskId IN (1293,1296,1295) THEN 1 ELSE 0 END --Кассы-метро 
,CASE WHEN vatcs.CashDeskId IN (21,994,1137,1150,1162,1163,1282,1314,1327,1328) THEN 1 ELSE 0 END --Кассы-остальные 
,CASE WHEN vatcs.CashDeskId IN (988) THEN 1 ELSE 0 END --Портал 2.0 
,CASE WHEN vatcs.CashDeskId IN (1089,1088,122,1085,1087,1084,1086,270) THEN 1 ELSE 0 END --Евросеть 
,CASE WHEN ISNULL(vatcs.CashdeskID, 0) NOT IN (1293,1296,1295,21,994,1137,1150,1162,1163,1282,1314,1327,1328,988,1089,1088,122,1085,1087,1084,1086,270) 

Можно ли его ускорить?

2) В ИНЕКЕ:

WHERE vatcs.SoldDate >= @beginDate 
     AND vatcs.SoldDate < DATEADD(DAY, 1, @endDate) 

Я не уверен, если это sargable и если не так, как я могу сделать это, чтобы быть sargable?

+1

Предложение 'Or' выполняется быстрее, чем' in', в некоторых местах вы можете использовать 'или' clasuse, где значения для сравнения не слишком велики. –

+0

Да. Я тоже думал. Означает ли это, что я не должен использовать OR, если у меня слишком много значений в IN (...)? – tesicg

+3

Не делайте этого, IN на самом деле похоже на сокращенное обозначение OR. – Serge

ответ

0

Вы ничего не можете сделать с CASE.

Что касается предложения WHERE, он должен использовать INDEX на SoldDate, если таковой существует (да, предложение WHERE - Sargable).
Но в случае, если в первый раз (в течение длительного времени) вы запускаете запрос, диапазон дат настолько широк, что сервер SQL делает полное сканирование, у вас может возникнуть проблема с параметром sniffing.

Таким образом, может быть полезно использовать подсказку запроса, чтобы заставить использовать индекс (вы не потеряете большую производительность, если бы полное сканирование было бы более эффективным).

FROM dbo.vatcs WITH (INDEX(IDX_vatcsInnerTable_SoldDate) 
+0

Я забыл написать, что данные поступают из представления, которое не имеет индексов, потому что в нем есть внешние объединения. – tesicg

+0

Является ли SoldDate рассчитанным значением? Если нет, существует ли на нем индекс? Потому что вы должны иметь возможность использовать индекс таблицы «child». – Serge

+0

SoldDate не вычисленное значение. Он исходит из таблицы, которая находится в выбранных столбцах в этом представлении. Я не уверен, что вы имеете в виду, «вы должны иметь возможность использовать индекс« child »таблицы представления». Как я могу это сделать? – tesicg

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