XQuery/Xpath 优化:查询同一个文档的不同部分
XQuery/Xpath optimization: query different parts of the same document
假设我们有 XML 个包含不同部分的文件:title
、description
、text
、note
.
<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(取自 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 避免嵌套循环等)在大多数情况下应该有所帮助,但在关键情况下可能仍然需要 运行 测试并找出在给定场景中实际效果最好的方法。
假设我们有 XML 个包含不同部分的文件:title
、description
、text
、note
.
<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(取自 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 避免嵌套循环等)在大多数情况下应该有所帮助,但在关键情况下可能仍然需要 运行 测试并找出在给定场景中实际效果最好的方法。