SQL Server 2014 データベースに、レコード変更の監査情報をVARCHAR(MAX)
列に格納するテーブルがあります (貧しい人々 の CDC)。
このデータは次の形式です。
<span class="fieldname">Assigned To</span>
changed from <span class="oldvalue">user1</span>
to <span class="newvalue">user2</span><br />
<span class="fieldname">Status</span>
changed from <span class="oldvalue">QA</span>
to <span class="newvalue">Development</span><br />
<span class="fieldname">Progress</span>
changed from <span class="oldvalue">Yes</span>
to <span class="newvalue">No</span><br />
...
次のように転置されたデータを取得するには、その情報を解析する必要があります。
Record FieldName OldValue NewValue
------ --------- -------- --------
1234 Assigned To user1 user2
1234 Status QA Development
1234 Progress Yes No
ストアド プロシージャは、データを XML に変換し、XPath を使用して必要な部分を取得することで、これを実行しようとします。
;WITH TT AS (
SELECT TransId,
CAST('<root><rec>' + REPLACE(REPLACE(TransDescription, 'Ticket reopened... Status', 'Status'), '<br />', '</rec><rec>') + '</rec></root>' AS XML) TransXml
FROM dbo.Trans
WHERE TransDate >= '11/1/2016'
AND (TransDescription LIKE '%Ticket reopened... Status%' OR TransDescription LIKE '%Status%'))
SELECT TransId,
TransXml,
FieldName = T.V.value('span[@class="fieldname"][1]', 'varchar(255)'),
OldValue = NULLIF(T.V.value('span[@class="oldvalue"][1]', 'varchar(255)'), 'nothing'),
NewValue = NULLIF(T.V.value('span[@class="newvalue"][1]', 'varchar(255)'), 'nothing')
INTO #tmp
FROM TT
CROSS APPLY TT.TransXml.nodes('root/rec') T(V);
実行計画は次のとおりです: https://www.brentozar.com/pastetheplan/?id=rJF2GRB7g
対応する IO 統計:
Table 'Trans'. Scan count 9, logical reads 27429, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 2964994, physical reads 0, read-ahead reads 0, lob logical reads 2991628, lob physical reads 0, lob read-ahead reads 0.
このクエリは非常に遅く (この例では 10 日分のデータのみを対象としています)、データが増えると次第に遅くなります。
このクエリを調整するためのオプションは何ですか?