如何提高存储过程的性能?

时间:2013-06-19 07:44:31

标签: sql-server performance

我有两个关于提高存储过程性能的问题:

1)在SELECT子句中:

,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子句中:

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

我不确定它是否可以被抄袭,如果不能,我怎么能让它成为可以攻击的?

1 个答案:

答案 0 :(得分:0)

关于CASE你无能为力。

对于WHERE子句,它应该在SoldDate上使用INDEX(如果存在)(是的,你的WHERE子句是Sargable)。
但是如果第一次(很长一段时间)你运行查询,日期范围是如此宽,sql server进行全面扫描,你可能有一个参数嗅探问题。

因此,使用查询提示以强制使用索引可能会很好(无论如何,在完全扫描效率更高的情况下,您不会失去很多性能)。

FROM dbo.vatcs WITH (INDEX(IDX_vatcsInnerTable_SoldDate)