2017-01-03 40 views
1

我有一個查詢,我使用了2個表中有大約一百萬行的內部連接。我試圖運行查詢,所以它只能從上個月獲取數據。但是,使用getDate()函數需要很長時間。但是,當我以這種格式'2016-12-01'和'2017-01-01'輸入日期時 - 確實很快。我如何修改查詢以使其運行速度更快?我讀過,我可能不得不創建一個非聚集索引,但我還不是很好。如何加速SQL查詢的日期

select 
    custKey, 
    sum(salesAmt) as Sales, 
    sum(returnAmt) as Credit, 
    (sum(salesAmt) - sum(returnAmt)) as CONNET 
from 
    [SpotFireStaging].[dbo].[tsoSalesAnalysis] 
inner join 
    [SpotFireStaging].[dbo].OOGPLensDesc as o on tsoSalesAnalysis.ItemKey = O.ItemKey 
where 
    PostDate between --DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-1,0) 
--AND DATEADD(MS, -3,DATEADD(MM, DATEDIFF(M,-1, GETDATE()) -1, 0)) 
    '2016-12-01' and '2017-01-01' 
group by 
    custkey 
+1

PostDate的數據類型是什麼?表中是否有索引? – Lamak

+1

是否有可能計算這兩個支架日期並將它們放入兩個變量之前?如果你這樣做會發生什麼?我的意思是@FirstDate和@ secondDate之間的PostDate。 – DVT

+0

嗨,是的,我試過這個,它工作完美。我不敢相信我沒有想到這一點。謝謝您的幫助! :) – Cesar

回答

4
declare @startDate DateTime = DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-1,0) 
declare @endDate DateTime = DATEADD(MS, -3,DATEADD(MM, DATEDIFF(M,-1, GETDATE()) -1, 0)) 

select 
    custKey, 
    sum(salesAmt) as Sales, 
    sum(returnAmt) as Credit, 
    (sum(salesAmt) - sum(returnAmt)) as CONNET 
from 
    [SpotFireStaging].[dbo].[tsoSalesAnalysis] 
inner join 
    [SpotFireStaging].[dbo].OOGPLensDesc as o on tsoSalesAnalysis.ItemKey = O.ItemKey 
where 
    PostDate between @startDate AND @endDate 
group by 
    custkey 

另一種選擇,看看這裏所選擇的答案:

When using GETDATE() in many places, is it better to use a variable?

GetDate()爲每個行分別計算的,所以我們得相信的時候也是如此DateDiff()DateAdd()。所以我們最好將它移入局部變量。