我在 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 天的数据),并且随着数据的增加而变得越来越慢。
调整此查询的选项有哪些?