2

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

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)

我不确定它是否是 sargable,如果不是,我怎样才能使它成为 sargable?

4

1 回答 1

0

对于 CASE,您无能为力。

至于 WHERE 子句,如果存在这样的子句,它应该在 SoldDate 上使用 INDEX(是的,您的 WHERE 子句是 Sargable)。
但万一你第一次(很长时间)运行查询,日期范围很宽,sql server 进行全扫描,你可能会遇到参数嗅探问题。

因此,最好使用查询提示来强制使用索引(在完全扫描本来会更有效的情况下,您不会损失太多性能)。

FROM dbo.vatcs WITH (INDEX(IDX_vatcsInnerTable_SoldDate)
于 2013-06-19T07:56:12.690 回答