使用选择性索引优化XML数据类型

时间:2017-07-12 14:46:03

标签: sql sql-server xml

我正努力在sql server 2012中使用xml列类型来提高查询的性能。我有一个名为'xmltable'的表,其中包含as列,id(int)和xml列'xmlvalue'。

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并在我的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

这种方法有效,但速度相当缓慢(对于100个行,几乎 2分钟,每个xml值为50个记录节点)。

然后我研究了xml索引和选择性xml索引。我尝试了很多东西,但似乎没有什么能改善性能......

  • 尝试添加主xml索引 - &gt;一切都变得更慢
  • 然后添加了辅助xml索引(所有三种类型) - &gt;没有改进

我尝试的最后一件事是添加一个选择性索引,映射到我在查询中使用的选择器,如下所示:

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

但仍然没有提高性能的运气。

有人能帮我一把吗?那太好了!

1 个答案:

答案 0 :(得分:0)

您可能会阅读this post,明白,在哪些情况下 XML索引可能会有所帮助,在这种情况下,此索引会让事情变得更糟......

就个人而言,我会避免使用XML索引......

您是否有充分的理由将此数据存储为XML? XML不是出于这样的目的......

我宁愿在1:n相关的索引表中对这些数据进行洗牌,并在需要时重新创建XML ...