2016-07-30 100 views
0

我想在下面的查詢運行約3秒imporve性能。我不熟悉SQL中的執行計劃分析和索引。mssql日期字段性能問題

我已經有DateFrom和DateTo文件(2個獨立索引和一個組合索引)的索引。我試圖在DateLiveActual文件上創建索引,但這些索引都沒有出現在執行計劃中。

你能幫我優化查詢嗎?

declare @today date = convert(date,GETUTCDATE()); 
DBCC DROPCLEANBUFFERS 

SELECT 
      S.LocationId 
      ,SBP.CurrencyId 
      ,SUM(CASE 
        WHEN S.ServiceStatusId = 1 THEN COALESCE (SBP.MRR, 0) 
        ELSE 0 
       END) AS ActiveMRR 
      ,MIN(S.DateLiveActual) AS MinServiceDateLiveActual 
     FROM dbo.service_Service AS S 
     INNER JOIN dbo.billing_ServiceBillingPeriod AS SBP ON SBP.ServiceId = S.Id 
     WHERE 
      SBP.DateFrom <= @today AND (SBP.DateTo >= @today OR SBP.DateTo IS NULL) 
     GROUP BY S.LocationId, SBP.CurrencyId 

enter image description here

回答

1

我覺得沒有什麼可以做。正如你可以從執行計劃中的箭頭粗細得出結論,你的where子句不是很有選擇性。你可以儘量減少使用較小的索引樹從billing_ServiceBillingPeriod讀取的字節數:

CREATE INDEX IX_DateRange 
ON billing_ServiceBillingPeriod(DateFrom, DateTo) 
INCLUDE (CurrencyId,ServiceID,MRR) 

沒有多少你可以用HASH做加盟,如果有許多行(粗箭頭)。合併連接速度更快,但需要有序的結果集(如果使用日期,記錄按日期排序,service_Service.Id是無序的)。同樣,您只能減少磁盤使用量,從較小的集合中創建哈希表。

+0

該索引改進了1秒的性能,感謝您的輸入..但是Min(DateLiveScheduled)需要1秒。無論如何,我們可以加快速度。實際上它在service_Service表上,所以SQL默認採用PK的索引。 – Raghav