マスター テーブルのトランザクション レコードの情報を持つ履歴テーブルが 1 つあります。このテーブルでは、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 が New のデータを取得したいと考えています。
次のようなクエリを作成しました
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 にはノード ID ごとに一意のデータがありますが、これは同じノード ID に対して複数の行を返します。これはトランザクション テーブルであるため、同じ XML を複数回格納できるためです。 XML 処理のために時間がかかると思います。
最初の取得のようにできますか
Select Top 1 nodeid from NodeHistory order by CreatedDate desc
次に、XML 部分を検索します。
パフォーマンスを向上させるためのより適切なビューに関するアイデアはありますか?