【问题标题】:XML data type optimizing with selective indexes使用选择性索引优化 XML 数据类型
【发布时间】:2017-07-12 14:46:03
【问题描述】:

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

id 只包含 ids,这是一个 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

这可行,但进展相当缓慢(对于 100000 行,每个 xmlvalue 为 50 个记录节点,几乎需要 2 分钟)。

然后我研究了 xml 索引和选择性 xml 索引。我尝试了很多东西,但似乎没有任何东西可以提高性能......

  • 尝试添加主 xml 索引 -> 一切都变得更慢
  • 然后添加了二级xml索引(所有三种类型)->没有改进

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

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

但在提高性能方面仍然没有运气。

有人可以帮我吗?那太好了!

【问题讨论】:

    标签: sql sql-server xml


    【解决方案1】:

    您可能会阅读this post,明白,在什么情况下XML 索引 可能会有所帮助,而在这种情况下,该索引会使事情变得更糟...

    我个人会避免使用 XML 索引...

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

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

    【讨论】:

    • 嘿 Shnugo,非常感谢您的回答,我已经潜伏在其他帖子中了 ;-) 我们这样存储数据的原因是因为它将是一个动态的结果表。管理员面包车创建某种形式的定义(也存储为 xml)。根据该定义,最终用户将能够填写表格,并且他的结果将存储在原始问题中发布的 xml 字段中。因此,我们将其用于响应的动态节点。首先,我们考虑动态创建结果表,但正如我们所见,xml 列似乎更灵活。很高兴对此有第二意见。
    • @Verthosa 动态数据不易查询,索引对您帮助不大...您可以使用索引视图,每个数据族一个,或者 - 如果您需要在所有情况下对同一字段进行排序 - 我会以这种排序顺序存储 XML(阅读 FLWOR XQuery)。
    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2015-01-18
    相关资源
    最近更新 更多