Optimization XQuery分组和聚合函数总是很慢吗?

Optimization XQuery分组和聚合函数总是很慢吗?,optimization,xquery,Optimization,Xquery,以一个简单的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/Ord

以一个简单的
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}" />
不同值中$orderId的
(doc('orderDetails.xml')//orderDetails/orderId)
让$totalValue:=
总数(
对于文档中的$detail(“orderdetails.xml”)//orderdetails[OrderID=$OrderID]
返回$detail/数量*$detail/单价
)
返回

忽略这样获取信息的愚蠢性,有没有更好的方法来编写XQUERY表达式?实际上,它非常非常慢(我使用的是XMLSpy)

这是XQuery 1.0中的一个主要缺陷,因此添加了group by子句,他们添加了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}" />

然后,该查询与GROUPBY具有相同的语义,因此应该进行优化。碰巧在XQSharp中,这仍然没有优化到一个组,所以我将其作为针对我们软件的bug提交。XmlSpy是否执行此优化,我不能说。

我想知道答案是否有更新,因为这个问题已经有将近10年的历史了。我在使用method、distinct-values()和group-by时都面临同样的问题:它们非常慢(与没有消除双值的xquery相比,它们是4秒,而不是大约250秒)
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}" />