xml - XQuery 性能 - 无序是答案吗?

标签 xml performance xquery

我有一个 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/

相关文章:

android - 通过参数将 Spannable 应用于 string.xml 中的字符串

performance - 有效的数据结构来保存带有通配符的字符串

php - 与仅处理 ob_get_clean() 的结果相比,将回调传递给 ob_start 有什么好处?

c# - 您使用常规构建作为编码工具吗?

xml - XQuery 中的 XPath : Fractional Digits

c# - 创建和处理 XmlNodeList

xml - Powershell 将 CSV 导出为 XML

java - 如何使用 XStream(部分)反序列化有错误的 xml

sql-server - SQL Server 中的 XQuery 对零值执行 SUM

xquery - 如何在 xquery 中导入通用模块命名空间