[英]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.