我有一个历史表,其中包含主表的交易记录信息,在该表中我使用 XML 列来存储该交易信息。带有数据的表结构如下所示,
在内容 XML 数据存储为 XML,如下所示。
<Answers>
<AnswerSet>
<Answer questionId="ProductCode">S3404</Answer>
<Answer questionId="ProductName">Parabolic Triple</Answer>
<Answer questionId="LegacyOptionID" selectedvalue="1389">1389</Answer>
<Answer questionId="LegacyContentID" selectedvalue="624">624</Answer>
<Answer questionId="LegacyPageID" selectedvalue="355">355</Answer>
<Answer questionId="LegacyParentID" selectedvalue="760">760</Answer>
</AnswerSet>
</Answers>
在所有行中,结构相同,但答案节点中的数据不同,我想获取 ProductCode="S3404" 且 CreatedDate 为新的数据。
我创建了类似的查询
select n2.* from nodehistory n2 CROSS APPLY
n2.content.nodes('Answers/AnswerSet') T(c) WHERE
c.value('./Answer[@questionId="ProductCode"][1]','varchar(100)') ='J154'
ProductCode 对每个 nodeid 都有唯一的数据,但是对于同一个 nodeid,这会返回多于一行,因为这是事务表,因此可以多次存储相同的 XML,为此需要像 Createddate desc 的 order 这样的条件,但执行此查询需要我认为由于 XML 处理需要更多时间。
我们可以先得到
Select Top 1 nodeid from NodeHistory order by CreatedDate desc
然后搜索 XML 部分。
关于更合适的视图以获得更好的性能的任何想法?