我正在尝试在 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/