为什么使用cross Apply来获取XML中的值?

时间:2017-06-19 10:27:48

标签: sql-server xml performance cross-apply

几天前,我尝试使用扩展事件替换SQL Server探查器。 然后我想用sql将生成的xel文件放在sql server数据库中。

我认为很可能,很多网站都使用带有Cross Apply的函数节点来获取XML中的值,即使它比不使用它更慢。 我不知道我错过了什么?

我的查询示例 enter image description here

1 个答案:

答案 0 :(得分:3)

简而言之:你可以用链锯切面包,或者你可以使用一些裸线,但不要责怪工具,如果结果不令人信服(即使它非常快:-D)... < / p>

如果有.nodes()个相关子节点,则需要 1:n才能将其作为派生表进行检索。

.nodes()增长到某个大小时,很多人使用XPath只是为了让代码更易于阅读,特别是对于非常深层嵌套的元素......

您将获得一个名为的当前节点,您可以从中继续XPath navigationXQuery。使用多个嵌套XML,您可以使用级联.nodes()来深入挖掘。

如果您确定<event>下面只有只有一个元素且名称为<data>且属性为@Name使用值NTCanonicalUserName,不需要.nodes()。可能最快的是使用像

这样的东西
/event[1]/data[@name="NTCanonicalUserName"][1]/value[1]/text()[1]

重要!
如果具有给定属性的<event>或多个<data>可能不止一个.nodes(),则“快速”调用将返回第一次出现的情况。这可能是错误的......并且你永远不会发现,还有另外一个......

您的“快速”通话速度很快,因为引擎事先知道,只会有一个结果。使用{ "products": [ {"id": 1, "category": "paint", "name": "clowd", "type": "matt emulsion", "stocked": true, "size": "100x130", "thumbnail": "23-sm.png", "previewImg": "23.png"}, {"id": 2, "category": "paint", "name": "dålig sikt", "type": "matt emulsion/olja/akryl", "stocked": true, "size": "100x130", "thumbnail": "24-sm.png", "previewImg": "24.png"}, {"id": 25, "category": "print", "name": "MIMI | 2nd edition", "type": "akvarellppr, 70x100", "limited": "30", "available": "28", "price": "3,000", "stocked": true, "thumbnail": "mimisecond-sm.jpg", "previewImg": "mimisecond.jpg"}, {"id": 26, "category": "print", "name": "max", "type": "uppspänd canvas, 95x120", "limited": "30", "available": "28", "price": "7,000", "stocked": true, "thumbnail": "max-sm.jpg", "previewImg": "max.jpg"}, {"id": 38, "category": "places", "stocked": true, "desc": "Vernisage Strössel @ Linnégatan, sthlm 2015", "thumbnail": "17.png", "previewImg": "17.png"}, {"id": 39, "category": "places", "stocked": true, "desc": "Max @ Nybergsgatan, sthlm 2016", "thumbnail": "26.png", "previewImg": "26.png"} ] } 时,eninge将不得不寻找进一步的出现,并将为开始的表创建结构。

一般建议
如果你知道什么,引擎无法知道,但会使阅读更快,你应该帮助引擎......

相关提示
在内部,真实/本机XML数据类型不会存储为您看到的字符串表示形式,而是存储为分层结构树。处理XML的速度非常快......在您的情况下,搜索只是将树直接跳到想要的元素。