我有两个关于提高存储过程性能的问题:
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)
我不确定它是否可以被抄袭,如果不能,我怎么能让它成为可以攻击的?
答案 0 :(得分:0)
关于CASE你无能为力。
对于WHERE子句,它应该在SoldDate上使用INDEX(如果存在)(是的,你的WHERE子句是Sargable)。
但是如果第一次(很长一段时间)你运行查询,日期范围是如此宽,sql server进行全面扫描,你可能有一个参数嗅探问题。
因此,使用查询提示以强制使用索引可能会很好(无论如何,在完全扫描效率更高的情况下,您不会失去很多性能)。
FROM dbo.vatcs WITH (INDEX(IDX_vatcsInnerTable_SoldDate)