[英]PostgreSQL function/query infinite execution
因此,我尝试使用在查询中创建的函数,并在执行查询时使其永远运行。 该功能查找客户其订单中产品数量最多的客户。 该查询将其与订购了相同数量产品的任何其他客户一起返回。
这是函数:
CREATE OR REPLACE FUNCTION max_orderQty ()
RETURNS bigint
AS $$
SELECT SUM(OrderQty)
FROM Customer,SalesOrderHeader,SalesOrderDetail
WHERE Customer.CustomerID = SalesOrderHeader.CustomerID
AND SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
GROUP BY SalesOrderHeader.CustomerID
ORDER BY SUM(OrderQty) DESC LIMIT 1;
$$ LANGUAGE SQL;
这是查询:
SELECT SUM(OrderQty),SalesOrderHeader.CustomerID
FROM Customer,SalesOrderHeader,SalesOrderDetail
WHERE Customer.CustomerID = SalesOrderHeader.CustomerID
AND SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
GROUP BY SalesOrderHeader.CustomerID
HAVING SUM(OrderQty) = max_orderQty();
这也有效,并且解决了同一件事:(220ms)
SELECT SUM(OrderQty),SalesOrderHeader.CustomerID
FROM Customer,SalesOrderHeader,SalesOrderDetail
WHERE Customer.CustomerID = SalesOrderHeader.CustomerID
AND SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
GROUP BY SalesOrderHeader.CustomerID
HAVING SUM(OrderQty) = (SELECT SUM(OrderQty)
FROM Customer,SalesOrderHeader,SalesOrderDetail
WHERE Customer.CustomerID = SalesOrderHeader.CustomerID
AND SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
GROUP BY SalesOrderHeader.CustomerID
ORDER BY SUM(OrderQty) DESC LIMIT 1);
因此,当我尝试将其拆分为函数/查询时,它会永远运行,而我找不到原因。而且我认为使用函数会更快,这是错误的吗?
任何帮助都非常感谢。 提前致谢。
没有理由认为某个功能会更快。 您的问题是正在为输出中的每一行调用该函数-并且每次都在重新进行计算。
您应该可以通过将函数声明为STABLE
来解决此问题; 默认值为VOLATILE
。
您可以在文档中了解这些细微差别。
编辑:
您可以通过仅调用一次函数来使其运行更快:
SELECT SUM(OrderQty),SalesOrderHeader.CustomerID
FROM Customer JOIN
SalesOrderHeader
ON Customer.CustomerID = SalesOrderHeader.CustomerID JOIN
SalesOrderDetail
ON SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID CROSS JOIN
(SELECT max_orderQty() as maxoq) x
GROUP BY SalesOrderHeader.CustomerID
HAVING SUM(OrderQty) = MAX(maxoq);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.