Warm tip: This article is reproduced from serverfault.com, please click

xml-XQuery / Xpath优化:查询同一文档的不同部分

(xml - XQuery/Xpath optimization: query different parts of the same document)

发布于 2020-12-03 00:10:29

比方说,我们有不同的部分XML文件:titledescriptiontextnote

<book>
    <title>Some title</title>
    <description>Some description</description>
    <text>Some texte</text>
    <note>Some note</note>
</book>

假设我们希望能够在这些不同的部分进行查询。这可以通过不同的方法来完成。

例如,我们只想在title和中查询note

方法1(基本详细版本)

for $result in (
    collection("path_to_my_collection")//title[ft:query(., "'word_to_search'")]
    , 
    collection("path_to_my_collection")//note[ft:query(., "'word_to_search'")]
    ) 

方法2(从此处获取此方法

for $result in collection("path_to_my_collection")//(title | note)[ft:query(., "'word_to_search'")]

方法3(该文档似乎建议使用此方法

let $docs_and_parts :=
    for $parts in (collection("path_to_my_collection")//title, collection("path_to_my_collection")//note) 
    return 
        $parts
        
for $result in $docs_and_parts[ft:query(., "'word_to_search'")]

看完XQuery优化技术之后我想知道这些方法中的哪一种在包含许多(超过100个)文件的大型集合中执行效率更高/速度更快?

Questioner
ag_1812
Viewed
11
wp78de 2020-12-04 10:17:49

我认为本文提到了在为eXists-db编写表达式时要考虑的所有相关方面,例如,避免不必要的嵌套过滤器,宁愿使用XPath谓词而不是where表达式,使用group by,一次构造初始节点集,并在查询多个时将其用作主表达式的输入集合..

似乎建议使用第三种方法,因为它遵循了在查询之前构造初始节点集的建议。

但是,方法2似乎仅依靠XPath来解决此问题;可能会更好。

最后,它取决于你的输入数据和优化器的实现细节。遵循一般建议和常识(例如避免嵌套循环等)在大多数情况下应该会有所帮助,但对于关键情况,仍可能需要运行测试并找出在给定情况下最有效的方法。