簡體   English   中英

如何避免為sum()反復調用cpu密集函數?

[英]how to avoid calling cpu intensive function repeatedly for sum()?

我有一個函數對傳遞的ID執行CPU大量計算,我正在處理報告以匯總結果,但是出於性能原因,我只希望每個ID調用一次函數

這是一個有效的SQL BUT的簡單示例,它為每一列調用一次函數。 如何重寫查詢,以便每個標識符僅調用一次函數?

    SELECT 
    SUM( case myfunction(employee_id) WHEN 'bob' THEN 1 ELSE 0 END) as "bob total",
        SUM( case myfunction(employee_id) WHEN 'joe' THEN 1 ELSE 0 END) as "Joe total",
    SUM( case myfunction(employee_id) WHEN 'tom' THEN 1 ELSE 0 END) as "Toms total"
    FROM employee

您可以在進行求和之前將邏輯放在子查詢中,然后引用單列。

SELECT 
    SUM( case FunctionResult WHEN 'bob' THEN 1 ELSE 0 END) as "bob total",
    SUM( case FunctionResult WHEN 'joe' THEN 1 ELSE 0 END) as "Joe total",
    SUM( case FunctionResult WHEN 'tom' THEN 1 ELSE 0 END) as "Toms total"
FROM    
    (   SELECT myfunction(employee_id) AS FunctionResult
        FROM employee
    ) AS e;

在性能方面,更好的解決方案是查看標量函數的實際作用,並問自己是否需要成為函數,是否可以將解決方案集作為基礎?

代替FROM employee ,使用定義如下的派生表:

SELECT *, myfunction(employee_id) AS myFuncResult
FROM employee

現在,您將myFuncResult作為附加列。 讓我們希望優化器不會干擾該策略。 它對標量函數成本沒有很好的了解(實際上沒有)。

由於您使用的是SQL Server,因此可以嘗試使用CROSS APPLY表達式,只需將.Result替換為函數返回的列的名稱:

SELECT 
    SUM( case func.Result WHEN 'bob' THEN 1 ELSE 0 END) as "bob total",
    SUM( case func.Result WHEN 'joe' THEN 1 ELSE 0 END) as "Joe total",
    SUM( case func.Result WHEN 'tom' THEN 1 ELSE 0 END) as "Toms total"
FROM employee e
CROSS APPLY myfunction(e.employee_id) as func

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM