Sql-Server

SQL Server 高雜湊匹配和排序

  • January 16, 2019

我有一個執行大約 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')

雜湊匹配的 58% 成本

首先,真正的 sql 測試是取變數而不是常量值。所以 ,

Declare @From date='2017-10-01' 
Declare @To date='2018-09-30'

立即修正,把過濾器放在這裡

select
g.*,
a.StateId, 
a.CountryId
into #Temp
from #TempGuidelineLog g
JOIN [vwCustomerAddress] a ON a.CustomerId = g.CustomerId
where g.CountryId = 1 and g.StateId NOT IN (65,66)

並從現在的位置刪除相同的過濾器。

我認為沒有要求,LogDate所以#TempGuidelineLog刪除它。

這麼新的索引,

CREATE NONCLUSTERED INDEX ix_temp1Customer ON #TempGuidelineLog (CustomerId)

由於countryid更具選擇性,

CREATE NONCLUSTERED INDEX ix_temp1Country ON #Temp (CountryId,Stateid,CustomerId)

CREATE NONCLUSTERED INDEX ix_temp1Country ON #Temp (CustomerId)

IMO,由 St.Name 和 co.Name 組成的組也在損害你的表現。

因此您可以按功能單獨查詢組,然後使用該結果集連接州和國家/地區表。希望很清楚。

創建 XML 的方式也很複雜。您可以從這裡選擇適合您的 xml 設計之一,XML

引用自:https://dba.stackexchange.com/questions/219986