実行に約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)
そして、現在の場所から同じフィルターを削除します。
#TempGuidelineLog
にLogDate
の要件がないため、削除します。
新しいインデックス、
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 [〜#〜]