XQuery中带索引或不带索引的Marklogic日期比较

XQuery中带索引或不带索引的Marklogic日期比较,marklogic,Marklogic,我需要使用Marklogic 8按日期(上周、上月等)筛选文档。该数据库包含130万个XML文档 文档如下所示: <work datum_gegenereerd="2015-06-10" gegenereerd="2015-06-10T14:28:48" label="gmb-2015-12000"> ... ... 我已经在work/@datum\u gegenererd(标量类型日期)上创建了一个范围元素属性索引 以下查询工作正常,但速度较慢(3秒): xquery版本“

我需要使用Marklogic 8按日期(上周、上月等)筛选文档。该数据库包含130万个XML文档

文档如下所示:

<work datum_gegenereerd="2015-06-10" gegenereerd="2015-06-10T14:28:48" label="gmb-2015-12000">
 ...

...
我已经在work/@datum\u gegenererd(标量类型日期)上创建了一个范围元素属性索引

以下查询工作正常,但速度较慢(3秒):

xquery版本“1.0-ml”;
在工作中花一美元
其中xs:date($a/@datum_gegenererd)>current-date()-5*xs:dayTimeDuration('P1D'))
返回
{基本uri($a)}
经过大量实验,我发现通过从where语句中删除xs:date强制转换,可以将性能降低到0.02秒

xquery version "1.0-ml";
for $a in //work
where $a/@datum_gegenereerd > current-date()-   5*xs:dayTimeDuration('P1D')
return
<hit>{base-uri($a)}</hit>
xquery版本“1.0-ml”;
在工作中花一美元
其中$a/@datum\u gegenererd>current-date()-5*xs:dayTimeDuration('P1D'))
返回
{基本uri($a)}
有人能解释这种行为吗


更新:
当我删除属性范围索引时,第二个变量的性能也会下降到3秒以上。重新创建索引会使性能恢复。这让我想知道如何阅读David下面的陈述,即无法使用来自普通xquery的自定义索引。 (顺便说一句:查询返回1267个XML文档,在总共135万个文档的数据库中,可能有450000个文档的根元素工作)
更新2:

我搞砸了0.02秒的性能指标。但是在查询控制台中速度非常快。在3个版本中,cts搜索似乎快了一点。

您可能已经创建了索引,但没有使用它。您需要使用查找所有日期在相关范围内的片段

类似于

cts:search(doc(), cts:element-attribute-range-query(xs:QName("work"), xs:QName("datum_gegenereerd"), ">" current-date()-   5*xs:dayTimeDuration('P1D'))
但是:如果您真的只需要URI,那么元素范围查询将用于(类似这样的内容-但是请检查文档)


第二个在内存中执行所有操作,只是从URI词典中提取URI,指向日期查询匹配的文档片段。

David,感谢您的快速响应。我的第二个示例(删除了xs:date的示例)必须使用索引,因为它与两个解决方案的速度相同。这与我添加到数据库中的范围元素属性不同吗?每个属性和每个元素都在“通用索引”中索引。总是。但是对于你的例子,(一个比其他东西小的范围),你需要一个范围索引来最有效地提出这些问题。我很惊讶我提供的解决方案(带有范围索引和cts:element属性范围查询)只在.02秒时给出结果。归还了多少文件?此外,您在返回URI时也会有更多的开销,因此我希望使用cts:uris可以获得更多的速度增益。我从未考虑过cts:uris函数。非常有用。这可能也很有用:是的,Geert也提出了一个很好的观点供将来参考。order by也受到范围索引的很大影响。但一般来说,从一开始就了解性能指南会有很大的不同。而且,由于您的查询只需要URI,您还可以让我们知道cts:URI查询的执行情况吗?您应该能够在查询控制台的“配置文件”选项卡中确定速度差异和性能影响的位置。
cts:search(doc(), cts:element-attribute-range-query(xs:QName("work"), xs:QName("datum_gegenereerd"), ">" current-date()-   5*xs:dayTimeDuration('P1D'))
cts:uris('', (), cts:element-attribute-range-query(xs:QName("work"), xs:QName("datum_gegenereerd"), ">" current-date()-   5*xs:dayTimeDuration('P1D'))