2015-03-19 48 views
0

管道函數的我有一個像性能差在SQL Developer中

FUNCTION FOO 
(
    <PARAMETERS_LIST> 
) RETURN T_TAB PIPELINED 
AS 
BEGIN 
FOR rec IN 
(<A LITTLE BIT COMPLEX QUERY WITH PARAMETERS_LIST>) 
    LOOP 
    PIPE row(T_WF(<COLUMN_LIST>)); 
    END LOOP; 
    RETURN; 
END FOO; 

流水線表函數我通過select * from TABLE(FOO(<PARAMETERS_LIST>)) WHERE ROWNUM <= 200測試在SQL Developer中查詢。 SQL Developer需要9秒才能返回數據。

儘管直接在SQL Developer中運行<A LITTLE BIT COMPLEX QUERY WITH PARAMETERS_LIST>需要0.9秒的時間。

爲什麼流水線功能很慢?

+0

查詢找到多少行 - 使用普通查詢是否需要0.9秒才能返回所有行或結果的第一頁,還是200行?當你直接運行時,你有沒有rownum限制?如果是這樣,可能會針對計數器進行優化,但這不會在遊標版本中發生,因爲該函數並不知道您在此時限制了結果。顯示直接運行的執行計劃可能會揭示某些事情;如果您將其限制爲200行,則顯示沒有此限制的執行計劃。 – 2015-03-19 12:56:28

+0

SQL開發人員首先顯示50行簡單查詢。我們還將rownum <= 50添加到普通查詢和select * from TABLE(FOO())WHERE ROWNUM <= 50',性能結果相同。接下來我將分析執行計劃。 – comphilip 2015-03-20 06:07:39

回答

0

不知道你的數據庫或實際功能很難說,可能是一系列的事情,比如缺少索引。

你可以做的是看看該計劃Oracle正在使用執行查詢:

explain plan for select * from TABLE(FOO(<PARAMETERS_LIST>)) WHERE ROWNUM <= 200 

SELECT * 
FROM TABLE(DBMS_XPLAN.DISPLAY); 

可能給你一個線索,其中瓶頸是。

你是順便在你的函數中使用循環,這可能會導致上下文切換,這肯定會降低性能(很多)。儘量防止它,如果你可以。關於上下文切換的更多信息:http://rajiboracle.blogspot.nl/2014/06/context-switches-and-performance-issue.html

+2

應該只有兩個上下文切換 - FOR r IN(qry)會自動優化以一次獲取100行。 – 2015-03-19 10:39:03

+0

謝謝你的建議。我們會很快做調查,並會給你一個反饋。 – comphilip 2015-03-20 06:09:03

+0

這是由於缺少索引。上下文切換不是問題,因爲只需要200條記錄。 – comphilip 2015-04-01 06:56:46