SQL Server 2012でxml列型を使用したクエリのパフォーマンスを向上させるのに苦労しています。列、ID(int)およびxml列 'xmlvalue '選択インデックスで最適化するXMLデータ型
IDは、単にIDを含み、これはxmlvalue値の例である:
<records><record><id>1</id><name>Melly</name></record><record><id>2</id><name>Ulrike</name></record><record><id>3</id><name>Susanne</name></record><record><id>4</id><name>Tarrance</name></record><record><id>5</id><name>Kasper</name></record><record><id>6</id><name>Linnet</name></record><record><id>7</id><name>Genia</name></record><record><id>8</id><name>Rianon</name></record><record><id>9</id><name>Marcelia</name></record><record><id>10</id><name>Vinny</name></record><record><id>11</id><name>Erin</name></record><record><id>12</id><name>Arielle</name></record><record><id>13</id><name>Adriane</name></record><record><id>14</id><name>Dixie</name></record><record><id>15</id><name>Terrye</name></record><record><id>16</id><name>Tish</name></record><record><id>17</id><name>Ginnie</name></record><record><id>18</id><name>Nat</name></record><record><id>19</id><name>Courtney</name></record><record><id>20</id><name>Dallas</name></record><record><id>21</id><name>Elly</name></record><record><id>22</id><name>Hershel</name></record><record><id>23</id><name>Gardner</name></record><record><id>24</id><name>Christoph</name></record><record><id>25</id><name>Richie</name></record><record><id>26</id><name>Reggi</name></record><record><id>27</id><name>Heywood</name></record><record><id>28</id><name>Hercules</name></record><record><id>29</id><name>Gawain</name></record><record><id>30</id><name>Adolphe</name></record><record><id>31</id><name>Lawton</name></record><record><id>32</id><name>Brooke</name></record><record><id>33</id><name>Rachelle</name></record><record><id>34</id><name>Dani</name></record><record><id>35</id><name>Sebastian</name></record><record><id>36</id><name>Guenevere</name></record><record><id>37</id><name>Perrine</name></record><record><id>38</id><name>Spenser</name></record><record><id>39</id><name>Kath</name></record><record><id>40</id><name>Kyrstin</name></record><record><id>41</id><name>Claudelle</name></record><record><id>42</id><name>Nicolas</name></record><record><id>43</id><name>Gherardo</name></record><record><id>44</id><name>Trefor</name></record><record><id>45</id><name>Bonny</name></record><record><id>46</id><name>Keri</name></record><record><id>47</id><name>Margie</name></record><record><id>48</id><name>Merle</name></record><record><id>49</id><name>Archambault</name></record><record><id>50</id><name>Paulie</name></record></records>
テーブルは複数のレコードを有することになります。考え方は、すべての行のxmlvalueを取得し、my xmlの名前ノードでデータをソートすることです。私はこのために、このクエリを使用しています:これは動作しますが、やや遅くなっ
select
id,
x.e.value('(id/text())[1]','int') as xmlid,
x.e.value('(name/text())[1]','nvarchar(200)') as xmlname
from dbo.xmltable tt
cross apply tt.xmlvalue.nodes('/records/record') as x(e)
ORDER BY xmlname ASC
(ほとんど2分50記録の各ノードxmlvalueと 100000の行を取ります)。
それでは、xmlインデックスと選択的なxmlインデックスについて調べました。私は多くのことを試してみましたが、何もパフォーマンスを向上させるように思わない...
- は、プライマリXMLインデックスを追加しようとしました - >は、すべてが
- が続いて二次XMLインデックス(全3種類)を添加しても遅く行ってきました -
CREATE SELECTIVE XML INDEX SXI_Selective_RecordDetails ON dbo.xmltable(xmlvalue) FOR ( pathRecord = '/records/record' AS XQUERY 'node()', pathNameValueRecord = '/records/record/name/text()' AS XQUERY 'xs:string' SINGLETON, pathIdValueRecord = '/records/record/id/text()' AS XQUERY 'xs:double' SINGLETON ) GO
しかし、それでもまだ、私ではありません運:>私が試しは改善
最終のものは、選択インデックス、私はこのように私のクエリで使用セレクタへのマッピングを追加しませんでしたパフォーマンスを向上させる。
私に手を差し伸べることができる人はいますか?それは素晴らしいだろう!
Shnugoねえ、大きな感謝あなたの答えは、私はすでに他の投稿に潜んでいました;-)私たちがこのようなデータを格納するのは、それが結果の動的な表になるからです。管理者のバンは何らかの種類のフォーム定義を作成します(xmlとしても格納されます)。その定義に基づいてエンドユーザはフォームに記入することができ、その結果は元の質問に投稿されたxmlフィールドに保存されます。だから私たちは応答の動的なノードにこれを使います。最初は結果テーブルを作成することを考えましたが、xmlカラムは柔軟性があるように見えました。これについて第二の意見を持っていいですね。 – Verthosa
@Verthosa動的データはクエリするのが簡単ではないので、インデックスはそれほど助けにならないでしょう。インデックス付きのビュー*を使用します。データの各ファミリに1つずつ、または - すべてのフィールドで同じフィールドの後にソートする必要がある場合ケース - XMLをこのソート順に格納します( 'FLWOR XQuery'を読んでください)。 – Shnugo