我有一个 XQuery 性能问题,希望有人能提供帮助。
下面的代码工作正常,但如果可能的话我想提高性能。 它正在做的是... - 获取命中中找到的 prodname 属性的所有不同值 然后 - 计算出每个不同值在点击中出现的次数 - 按顺序返回这些不同的值以及每个值的总数
有时,我的 $hits 中有多达 12000 个项目,因此整个过程可能需要一段时间(无论如何,比我希望的时间要长)。
我读到,使用无序表达式/函数可以显着提高性能。 所以,我的问题是,是否有一种方法可以提高下面代码的性能 - 使用无序或任何其他方式 - 以及需要进行哪些编码更改? 我仍然需要保留“order by $d”行,以便将不同的值保留在返回的 alpha 顺序中
let $tempResult :=
for $d in distinct-values($hits/ancestor-or-self::DOCUMENT/@prodname)
let $q := $hits/ancestor-or-self::DOCUMENT[@prodname = $d] (: all the hits where prodname attribute has value of $d :)
order by $d
return <item zprodname="{$d}" zprodnamenum="{count($q)}"/>
最佳答案
XQuery 优化器在不同产品之间存在巨大差异,并且提高一种产品性能的技术可能与另一种产品有很大不同。因此,如果不(a)知道您正在使用什么产品,并且(b)对该产品的优化器有相当详细的了解,就无法回答这个问题。
我看不出为什么“无序”应该有助于提高此查询的性能,但如果您想找到答案,请尝试一下。
为了尝试改进此查询,我要做的第一件事就是输入 $hits/ancestor-or-self::DOCUMENT 的值(或者可能是 $hits/ancestor-or-self::DOCUMENT/@prodname ) 到一个变量中。它可能会对某些产品产生影响,也可能不会。
不幸的是,XQuery 1.0 没有为您提供除了这种“嵌套循环”样式之外的其他编写分组查询的方法。如果您无法让它执行,请考虑使用 XSLT 2.0 xsl:for-each-group 指令,该指令更有效率,因为您准确地说出您想要的内容,并且只要求一次传递数据。
关于xml - XQuery 性能 - 无序是答案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7436840/