我有一个大约需要 40 秒才能运行的 SQL 语句,我唯一看到的是高哈希匹配和排序。我已将索引添加到临时表,但仍需要很长时间才能完成。
https://www.brentozar.com/pastetheplan/?id=rJ7iMDC9m
SQL Server 执行时间:CPU 时间 = 46735 毫秒,耗用时间 = 9004 毫秒。
SELECT g.CustomerId, g.LogDate
INTO #TempGuidelineLog
FROM vwGuidelineLog g --nolock
where g.LogDate >= '2017-10-01' and g.LogDate < dateadd(day, 1, '2018-09-30')
CREATE NONCLUSTERED INDEX ix_temp1Customer ON #TempGuidelineLog (CustomerId)
INCLUDE ([LogDate])
select
g.*,
a.StateId,
a.CountryId
into #Temp
from #TempGuidelineLog g
JOIN [vwCustomerAddress] a ON a.CustomerId = g.CustomerId
CREATE NONCLUSTERED INDEX ix_temp1Country ON #Temp (CountryId)
INCLUDE ([CustomerId])
SELECT States=(SELECT Total=COUNT(c.CustomerID), c.StateId, st.Name
,[Distinct] = COUNT(DISTINCT c.CustomerId)
FROM #Temp c
JOIN [State] st ON st.StateId = c.StateId
where c.CountryId = 1 and st.StateId NOT IN (65,66)
GROUP BY c.StateId, st.Name
ORDER BY 1 DESC
FOR XML PATH('State'),type)
,Dates = (SELECT StartDate = CONVERT(VARCHAR(10), '2017-10-01' , 101), EndDate = CONVERT(VARCHAR(10), '2018-09-30', 101)
FOR XML PATH('Date'),type)
,Countries=(SELECT Total=COUNT(c.CustomerID), co.CountryID, co.Name, ISOCode=co.TwoLetterISOCode
,[Distinct] = COUNT(DISTINCT c.CustomerId)
FROM #Temp c
JOIN Country co ON co.CountryID = c.CountryId
GROUP BY co.CountryID, co.Name,co.TwoLetterISOCode
ORDER BY 1 DESC
FOR XML PATH('Country'),type)
FOR XML PATH('Report')
首先,对 sql 的真正测试是采用变量而不是常量值。所以 ,
立即更正,将过滤器放在这里
并从现在的位置删除相同的过滤器。
我看不到 in 的要求,
LogDate
所以#TempGuidelineLog
删除它。如此新的指数,
由于
countryid
更具选择性,IMO,由 St.Name 和 co.Name 组成的小组也损害了您的表现。
因此您可以按功能单独查询组,然后使用该结果集加入州和国家/地区表。希望它很清楚。
您创建 XML 的方式也很复杂。您可以从这里选择适合您的 XML 设计之一,XML