代码之家  ›  专栏  ›  技术社区  ›  blank

xquery分组和聚合函数总是慢吗?

  •  2
  • blank  · 技术社区  · 16 年前

    简单地说 OrderDetail 有一个 Quantity 和 UnitPrice 每一个记录。用sql获取每个订单的总价值很简单

    SELECT OrderID, SUM(UnitPrice*Quantity)
    FROM OrderDetail
    GROUP BY OrderID
    

    在将表转换为xml文件之后,使用xquery,我可以获得如下相同的信息

    for $orderId in distinct-values(doc('orderDetails.xml')//orderDetails/OrderID)
       let $totalValue := 
          sum(
          for $detail in doc("orderdetails.xml")//OrderDetails[OrderID =$orderId]
             return $detail/Quantity * $detail/UnitPrice
          )
    return <order id="{$orderId}" totalValue="{$totalValue}" />
    

    无视透明 愚笨 要获得这样的信息,有没有更好的方法来编写xquery表达式?因为它非常非常慢(我正在使用xmlspy)。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Oliver Hallam    16 年前

    这是XQuery1.0中的一个主要缺陷,因此在 XQuery 1.1 ,它们添加了GROUP BY子句,因此您的查询如下所示:

    for $orderDetails in doc('orderDetails.xml')//OrderDetails)
    let $orderId = $orderDetails/OrderID
    let $orderCost = $orderDetails/Quantity * $orderDetails/UnitPrice
    group by $orderId
    let $totalValue := sum($orderCost)
    return <order id="{$orderId}" totalValue="{$totalValue}" />
    

    然而,不幸的是,XQuery1.1仍然只是一个工作草案,几乎没有可用的实现。

    我们的实现(xqsharp)尝试找出您使用的模式,并更有效地执行group by(在查询计划中显示为group by)。不幸的是,我们的实现并没有在您的特定情况下发现group by。

    第一个问题是大小写差异(“orderdetails.xml”与“orderdetails.xml”, //orderDetails VS //OrderDetails )-我想这些只是打字错误。

    最大的问题是你所写的不是一个微不足道的小组!

    除非使用的架构另有指示,否则静态分析无法确定每个节点只有一个orderid,并且orderid的原子化值可能有多个项(如果它的架构类型为列表)。这意味着静态分析 distinct-values(doc('orderDetails.xml')//orderDetails/OrderID) 无法确定每个节点只有一个键。

    为了解决这个问题,可以按如下方式编写查询:

    for $orderId in distinct-values(doc("orderDetails.xml")/OrderDetails/exactly-one(OrderID/data(.)))
    let $totalValue := 
       sum(
          for $detail in doc("orderDetails.xml")/OrderDetails[exactly-one(OrderID/data(.)) = $orderId]
          return $detail/Quantity * $detail/UnitPrice
       )
    return <order id="{$orderId}" totalValue="{$totalValue}" />
    

    然后,该查询具有与group by相同的语义,因此应进行优化。碰巧这仍然没有在xqsharp中对一个组进行优化,所以我将此作为一个针对我们软件的bug提交。我不知道xmlspy是否执行这种优化。