xml - 在 marklogic 中的多个集合之间查询时优化记录的检索

标签 xml xquery marklogic marklogic-8 marklogic-9

我正在尝试在 2 个具有连接条件的集合之间进行查询, 假设这 2 个文件是:

集合 1:公司(1M 文档)

公司文件:

<Company>
 <CompanyName>XYZ</CompanyName>  
 <Description>ABC</Description>
  .
  .
</Company>

集合 2:员工(100 万个文档)

XML:

<Employee>
 <EmpName>john</EmpName>  
 <CompanyName>XYZ</CompanyName>  
  .
  .
</Employee>

我正在使用的查询是,

for $company in collection('Company'), $employee in collection('Employee')
where ( $company/Company/CompanyName eq $employee/Employee/CompanyName)
return document-uri($company)

当两个集合中的文档较少时,能够获取记录, 但是当我做压力测试时说,两个集合中的 1M 记录,在这种情况下会花费大量时间并导致时间限制超出异常。有没有办法优化这个查询?

我尝试了以下方法, 假设存在 CompanyName 的范围索引,

for $company in collection('Company'), $employee in cts:values(cts:path-reference('/Employee/CompanyName'))
where ( $company/Company/CompanyName eq $employee)
return document-uri($company)

如果 companyName 是唯一的,那么上面的查询将不会优化太多。我需要一种可以同时处理元素的不同值和重复值的方法

最佳答案

利用索引和 cts:* 函数可以显着加快速度。

使用cts:element-values()Employee 集合中的文档中检索 CompanyName 值集。

使用cts:uris()使用 cts:element-range-query()Company 集合中检索文档 URI 集合,这些 URI 具有来自 Employee 文档的值集合中的 CompanyName 值.

let $CompanyName := xs:QName("CompanyName")
let $employee-companies := cts:element-values($CompanyName, "", (), cts:collection-query("Employee"))
return
  cts:uris("", (), cts:and-query((
    cts:collection-query("Company"), 
    cts:element-range-query($CompanyName, "=", $employee-companies) 
  )))

关于xml - 在 marklogic 中的多个集合之间查询时优化记录的检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74623487/

相关文章:

XML 架构 : how to have multiple identical elements?

javascript - 在使用 XMLSerializer() 序列化 XML 之前从 XML 中删除无效字符

html - 在 XQuery HTML 输出中保留空格

group-by - 如何在 Marklogic 中使用 Group By?

java - MarkLogic Java XCC 异常

marklogic - 在 MarkLogic 8 中删除/更新双时态三元组

random - Marklogic:如何从序列中随机返回一组项目(随机样本)?

java - 如何使用 Java 转义 XML 中的退格键?

c# - 检查 XElement 是否全局为 null

xml - 如何配置 BaseX 以在 VS Code 中使用