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

Why use cross Apply to get the values in XML?

几天前,我尝试用扩展事件替换 SQL 服务器分析器。 然后我想将在sql服务器数据库中生成的xel文件放入sql。

我认为很有可能,很多站点使用带有交叉应用的功能节点来获取 XML 中的值,即使它比不使用它更慢。 我不知道我是否遗漏了什么?

我的查询示例

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

需要 .nodes() 如果有 1:n 个相关子节点,以便将它们检索为派生 table。

许多人使用 .nodes() 只是为了提高代码的可读性,尤其是对于嵌套非常深的元素,当 XPath 增长到一定规模时...

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

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

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

重要!
如果可能有多个 <event> 或多个 <data> 具有给定的属性,则您的 "fast" 调用将 return 第一次出现在任何地方。这可能是错误的...你永远不会发现,还有另一个...

您的 "fast" 调用速度很快,因为 引擎预先知道 只会有一个结果。使用 .nodes() 时,eninge 将不得不寻找进一步的事件,并将进行开销以创建派生的结构 table。

一般建议
如果你知道一些东西,引擎无法知道,但会让阅读速度更快,你应该帮助引擎...

很高兴知道
在内部 real / native XML 数据类型 不是存储为您看到的字符串表示形式,而是存储为层次结构树。处理 XML 的速度快得惊人......在你的情况下,搜索只是直接从树上跳到想要的元素。