2013-06-19 24 views
2

我對提高存儲過程的性能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) 

我不知道這是否是優化搜索,如果沒有我怎樣才能使之成爲優化搜索?

+1

'或'子句比'in'快,在某些地方可以使用'或'clasuse,其中與其比較的值不是太多。 –

+0

是的。我也曾這麼想過。這是否意味着我不應該使用OR,以防IN(...)中的值太多? – tesicg

+3

不要那樣做,IN實際上就像是OR的簡寫。 – Serge

回答

0

對於CASE,你無能爲力。

至於WHERE子句,它應該在SoldDate上使用INDEX(如果存在的話)(是的,你的WHERE子句是Sargable)。
但是,如果第一次(很長一段時間)運行查詢,日期範圍非常寬,sql server會進行全面掃描,您可能會遇到參數嗅探問題。

因此,使用查詢提示以強制索引使用(在不管怎樣全面掃描會更有效的情況下,您不會失去很多性能)。

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

我忘了寫數據來自沒有索引的視圖,因爲它有外部連接。 – tesicg

+0

被銷售日期計算值?如果沒有,它是否存在一個索引呢?因爲你應該能夠使用視圖的「子」表索引。 – Serge

+0

SoldDate不是計算值。它來自該視圖中選定列中的表格。我不確定你的意思是「你應該能夠使用視圖的」子「表索引」。我怎樣才能做到這一點? – tesicg