为什么要用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 navigation
或 XQuery
。使用多个嵌套 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 的速度快得惊人......在你的情况下,搜索只是直接从树上跳到想要的元素。
几天前,我尝试用扩展事件替换 SQL 服务器分析器。 然后我想将在sql服务器数据库中生成的xel文件放入sql。
我认为很有可能,很多站点使用带有交叉应用的功能节点来获取 XML 中的值,即使它比不使用它更慢。 我不知道我是否遗漏了什么?
我的查询示例
简而言之:你可以用链锯切面包,或者你可以使用一些裸线,但如果结果不令人信服,请不要责怪工具(即使它非常快:-D).. .
您需要 .nodes()
如果有 1:n
个相关子节点,以便将它们检索为派生 table。
许多人使用 .nodes()
只是为了提高代码的可读性,尤其是对于嵌套非常深的元素,当 XPath
增长到一定规模时...
您将获得一个命名的 当前节点 ,您可以从那里继续 XPath navigation
或 XQuery
。使用多个嵌套 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 的速度快得惊人......在你的情况下,搜索只是直接从树上跳到想要的元素。