Sql-Server
SQL Server 高雜湊匹配和排序
我有一個執行大約 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 測試是取變數而不是常量值。所以 ,
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