2014-07-02 38 views
-1

在查詢中,當我在查詢中使用字符串作爲日期時,我發現查詢中的性能下降(速度降低了2倍-3倍),而不是將字符串值放入首先變量爲smalldatetime。因此,例如,例如在不首先轉換爲日期時間時性能顯着下降

declare @rptDate AS smalldatetime 
set @rtpDate = CAST('2014-06-22' AS smalldatetime) 
SELECT SUM(tons) FROM sales 
WHERE ItemClass IN (1, 3, 5, 7) 
    AND AcctNo LIKE '31_-30[12]0' 
    AND YEAR(InvDate) = YEAR(@rptDate) 
    AND MONTH(InvDate) = MONTH(@rptDate) ' 
    AND DAY(InvDate) <= DAY(@rptDate) 

肯定比

SELECT SUM(tons) FROM sales 
WHERE ItemClass IN (1, 3, 5, 7) 
    AND AcctNo LIKE '31_-30[12]0' 
    AND YEAR(InvDate) = YEAR('2014-06-22') 
    AND MONTH(InvDate) = MONTH('2014-06-22') 
    AND DAY(InvDate) <= DAY('2014-06-22') 

那麼,爲什麼 「適當的優化」 不是這裏發生的更快?

+0

你有沒有試圖使三個獨立瓦爾爲'@ month','@ day'和'@ year'? – dasblinkenlight

+0

如果需要解析字符串到每一行的日期。它可能會阻止索引的使用。 – Paparazzi

回答

0

我會去一個進一步

declare @rptDate AS smalldatetime 
declare @year as int 
declare @month as int 
declare @day as int 
set @rtpDate = CAST('2014-06-22' AS smalldatetime) 
set @year = year(@rtpDate) 
set @month = month(@rtpDate) 
set @day = day(@rtpDate) 

SELECT SUM(tons) FROM sales 
WHERE ItemClass IN (1, 3, 5, 7) 
    AND AcctNo LIKE '31_-30[12]0' 
    AND YEAR(InvDate) = @year 
    AND MONTH(InvDate) = @month 
    AND DAY(InvDate) <= @day 
+0

我意識到這可以優化。我真正想要的是爲什麼SQL Server不能自己做這種優化。看來這是一個明顯的例子。 T-SQL或SQL Server固有的東西,我錯過了爲什麼它不能? – Conrad

+0

忘掉你認爲SQL可以做的事,並專注於你可以做的事。 – Paparazzi

+0

我真的想在這裏理解SQL Server的內部工作原理。我實際上需要將它放在視圖中,因此在這種情況下不能創建變量。 – Conrad

相關問題