web-dev-qa-db-ja.com

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')

58% Cost for Hash Match

4
Jefferson

まず最初に、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)

そして、現在の場所から同じフィルターを削除します。

#TempGuidelineLogLogDateの要件がないため、削除します。

新しいインデックス、

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)

St.Nameとco.Nameでグループ化されたIMOもパフォーマンスを低下させています。

したがって、関数ごとにグループを個別にクエリし、その結果セットで州と国のテーブルを結合できます。

XMLを作成する方法も複雑です。ここから、どのスイートのxmlデザインを選択することができます [〜#〜] xml [〜#〜]

0
KumarHarsh