2016-07-30 78 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