mssql日期字段性能问题

时间:2016-07-30 16:29:54

标签: sql-server sqlperformance

我试图在下面的查询中提高性能,该查询运行大约3秒钟。我不熟悉SQL中的执行计划分析和索引。

我已经对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 个答案:

答案 0 :(得分:1)

我认为你无能为力。从执行计划中的箭头粗细可以得出结论,你的where子句不是很有选择性。您可以尝试使用较小的索引树减少从billing_ServiceBillingPeriod读取的字节数:

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

如果有很多行(粗箭头),则无法使用HASH连接。合并连接速度更快,但需要有序的结果集(如果使用的日期是日期排序的记录,则service_Service.Id是无序的)。同样,您只能减少从较小集创建哈希表的磁盘使用量。