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

XQuery/Xpath optimization: query different parts of the same document

假设我们有 XML 个包含不同部分的文件:titledescriptiontextnote.

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

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

比如我们只想查询titlenote.

方法 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(取自 here

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

方法 3(这个似乎是 documentation 推荐的)

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 optimization technic 后,我想知道这些方法中哪一种更适合 efficient/fast 在包含许多(超过 100 个)文件的大型集合中执行?

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

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

但是,方法 2 似乎仅依靠 XPath 就可以解决这个问题;这可能会更好。

最终还是要看你的输入数据和优化器的实现细节。遵循一般建议和常识(e.g.g 避免嵌套循环等)在大多数情况下应该有所帮助,但在关键情况下可能仍然需要 运行 测试并找出在给定场景中实际效果最好的方法。