简体   繁体   English

PostgreSQL函数/查询无限执行

[英]PostgreSQL function/query infinite execution

So I tried to use a function I created into a query and when I execute the query it runs forever. 因此,我尝试使用在查询中创建的函数,并在执行查询时使其永远运行。 The function finds the customer that his orders had the biggest quantity of products in it. 该功能查找客户其订单中产品数量最多的客户。 The query returns him along with any other customer that has ordered the same amount of products. 该查询将其与订购了相同数量产品的任何其他客户一起返回。

Here is the function: 这是函数:

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;  

Here is the the query: 这是查询:

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();

Also this works and it solves the same thing:(in 220ms) 这也有效,并且解决了同一件事:(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);

So when I tried to split it to function/query it just runs forever and I cannot find the reason why.And I thought using a function instead would be faster.Is that wrong? 因此,当我尝试将其拆分为函数/查询时,它会永远运行,而我找不到原因。而且我认为使用函数会更快,这是错误的吗?

Any help is very appreciated. 任何帮助都非常感谢。 Thanks in advance. 提前致谢。

There is no reason to think that a function would be faster. 没有理由认为某个功能会更快。 Your problem is that the function is being called for each row in the output -- and the calculation is being re-done each time. 您的问题是正在为输出中的每一行调用该函数-并且每次都在重新进行计算。

You should be able to fix this by declaring the function to be STABLE ; 您应该可以通过将函数声明为STABLE来解决此问题; the default is VOLATILE . 默认值为VOLATILE

You can read about these nuances in the documentation . 您可以在文档中了解这些细微差别。

EDIT: 编辑:

You can force it to run faster by only calling the function once: 您可以通过仅调用一次函数来使其运行更快:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM