【发布时间】: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