Performance 如何提高Marklogic 7在以下方面的性能:/*[fn:name()=“something”]

Performance 如何提高Marklogic 7在以下方面的性能:/*[fn:name()=“something”],performance,marklogic,marklogic-7,Performance,Marklogic,Marklogic 7,我有一个基本问题: /*[fn:name()="something"] (1) Marklogic 7需要几秒钟的时间,是否可以添加索引以加快查询速度 (2) 应增加哪些内存限制以提高性能 (3) 是否有其他方法可以提高不同查询的性能,但得到完全相同的结果?尝试使用fn:node name。我相信这是优化的。您需要正确地处理名称空间,这就是为什么它可以被优化,而fn:name不能 /*[fn:node-name()=fn:QName("","something")] 以下两个XPath应

我有一个基本问题:

/*[fn:name()="something"]
(1) Marklogic 7需要几秒钟的时间,是否可以添加索引以加快查询速度

(2) 应增加哪些内存限制以提高性能


(3) 是否有其他方法可以提高不同查询的性能,但得到完全相同的结果?

尝试使用
fn:node name
。我相信这是优化的。您需要正确地处理名称空间,这就是为什么它可以被优化,而
fn:name
不能

 /*[fn:node-name()=fn:QName("","something")] 

以下两个XPath应该完全相同:

/theNameOfMyElement

后者添加了一个不必要且代价高昂的限定符。首先,
*
必须搜索所有内容,而不仅仅是元素。这种方法还存在其他几个问题

如果我的第一个查询仍然需要很长时间,请使用
cts:search
,这会更快地搜索索引。上面的查询可以这样写:

cts:search(/theNameOfMyElement, ())
其中第二个参数(空序列)可以是限定的
cts:query

如果名称空间适合您,您只需执行以下操作:

/*:theNameOfMyElement
/*[fn:name()。改用
/something

编辑

在看到另一个答案被接受后,我一直在想,如果他的解决方案有效,而我的解决方案无效,你必须尝试解决什么样的情况。我仍然非常确定,有一种更快的方法,就是按照设计的方式使用xPath

经过一番思考,我决定您的“真实”场景必须包含一个动态元素名,或者您可能正在尝试查看元素名是否与一系列名称中的一个匹配

我用下面提供的输出绘制了一个示例,演示了如何在不使用基于
fn:node name

let $xml as element(sample) := <sample>
    <wrapper>
      <product>
        <entry>
          <red>$1.00</red>
          <yellow>$3.00</yellow>
          <blue>$4.50</blue>
        </entry>
      </product>
    </wrapper>
  </sample>
let $type as xs:string := "product"
return $xml/wrapper/xdmp:unpath($type)/entry/(red|yellow)

(: Returns 
  <red>$1.00</red>
  <yellow>$3.00</yellow> 
:)
让$xml作为元素(示例):=
$1.00
$3.00
$4.50
让$type作为xs:string:=“产品”
返回$xml/wrapper/xdmp:unpath($type)/entry/(红色|黄色)
(:返回)
$1.00
$3.00 
:)

除了其他好的建议,考虑应用分页。MarkLogic可以快速从索引中识别出感兴趣的内容,但从磁盘中提取实际内容的速度相对较慢。同时发送所有结果可能意味着在通过网络发送回复之前,尝试将所有结果(可能是数十亿)保存在内存中。分页允许分批提取结果,从而保持较低的内存使用率,并可能允许并行化


谢谢,我试试看。快1000倍。明亮的这里是替换:/*[fn:node-name()=fn:QName(“,“something”)]在规模上,这取决于通过索引查找可以完成多少工作,以及必须获取和过滤多少文档。在索引查找方面做更多的工作可以避免花费在文档获取和筛选上的时间。MarkLogic自动按QName而不是字符串名对元素进行索引。这就是为什么
/*[fn:node-name()=fn:QName(“,“fubar”)]
可以很快,但是
/*[fn:name()=“fubar”]
可能很慢的原因,
/*:fubar
也是如此。我不确定类似于
document()/xdmp:unpath('fubar')
——但它不太可能比
fn:node name
更快。如果以编程方式访问节点,第二种格式似乎是一种有用的构造。e、 g.如果要将节点名作为xs:string传递给函数,则需要使用格式/*[fn:name()=“blah”]选项以编程方式访问节点非常好。但是使用
fn:node name
而不是
fn:name
。这不仅仅是因为性能。以字符串形式传递节点名称的代码非常可疑,可能存在错误。当输入具有违反其预期的命名空间声明,并且节点处理代码无法控制输入命名空间声明时,它将崩溃。为了安全起见,请使用带有
fn:node name
的QName。与字符串不同,这是名称空间感知的。
let $xml as element(sample) := <sample>
    <wrapper>
      <product>
        <entry>
          <red>$1.00</red>
          <yellow>$3.00</yellow>
          <blue>$4.50</blue>
        </entry>
      </product>
    </wrapper>
  </sample>
let $type as xs:string := "product"
return $xml/wrapper/xdmp:unpath($type)/entry/(red|yellow)

(: Returns 
  <red>$1.00</red>
  <yellow>$3.00</yellow> 
:)