【问题标题】:Marklogic date comparison in XQuery with or without indexXQuery 中带或不带索引的 Marklogic 日期比较
【发布时间】:2016-04-27 17:49:03
【问题描述】:

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

文件如下所示:

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

我在 work/@datum_gegenereerd(标量类型日期)上创建了一个范围元素属性索引。

以下查询有效,但速度很慢(3 秒):

xquery version "1.0-ml";
for $a in //work
where xs:date($a/@datum_gegenereerd) > current-date()-   5*xs:dayTimeDuration('P1D')
return
<hit>{base-uri($a)}</hit>

经过大量试验,事实证明,通过从 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>

谁能解释这种行为?


更新:
当我删除属性范围索引时,第二个变体的性能也下降到 3+ 秒。重新创建索引可以恢复性能。这让我想知道如何阅读下面大卫的声明,即无法使用普通 xquery 中的自定义索引。 (顺便说一句:该查询返回 1267 个 XML 文档,在 135 万个文档的总数据库中,可能有 450000 个具有根元素的文档)
更新 2:
我搞砸了 0.02 秒的性能指标。但在查询控制台中速度非常快。在 3 个版本中,cts-search 似乎快了一点。

【问题讨论】:

  • 由于您的查询只需要 URI,您能否告诉我们 cts:uris 查询的执行情况?
  • 您应该能够在查询控制台的“配置文件”选项卡中确定速度差异以及性能命中的位置。

标签: marklogic


【解决方案1】:

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

类似

cts:search(doc(), cts:element-attribute-range-query(xs:QName("work"), xs:QName("datum_gegenereerd"), ">" current-date()-   5*xs:dayTimeDuration('P1D'))

但是:如果您真的只想要 URIS,那么 element-range-query 将与 cts:uris 一起使用(类似这样 - 但请查看文档)

cts:uris('', (), cts:element-attribute-range-query(xs:QName("work"), xs:QName("datum_gegenereerd"), ">" current-date()-   5*xs:dayTimeDuration('P1D'))

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

【讨论】:

  • 大卫,感谢您的快速回复。我的第二个示例(删除 xs:date 的示例)必须使用索引,因为它与您的两个解决方案的速度相同。这是不是与我添加到数据库中的范围元素属性不同的索引?
  • 每个属性和每个元素都在“通用索引”中编制索引。总是。但是对于您的示例(比其他东西少 - 范围),您需要一个范围索引来最有效地提出这些问题。我很惊讶我提供的解决方案(带有范围索引和 cts:element-attribute-range-query)仅在 0.02 秒时给出结果。退回了多少文件?此外,您在返回 URI 时也会有更多开销,所以我预计使用 cts:uris 会获得更多速度
  • 再次感谢。而且我从未考虑过 cts:uris 函数。非常有用。
  • 是的,Geert 也提出了一个很好的观点以供将来参考。排序依据也受到范围索引的很大影响。但总的来说,从高水平开始了解性能指南会有很大的不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多