簡體   English   中英

在Pipelined函數上的Oracle Query工作正常,但是如果我添加一個條件則會窒息

[英]Oracle Query upon a Pipelined function works ok but chokes if I add a condition

我有一個pipelind函數,它返回一組自定義對象,即一個嵌套表。

當我從中選擇它時,它工作得很好 (<4秒);

select e.* from table(MY_PIPLINED_FUNCTION)e

但是當我添加任何條件時(除了where rownum<X ),查詢需要永遠執行(如5分鍾以上),但它確實在最后正確返回所需的值

令我難以置信的是它正在發揮作用,但需要花費大量時間才能完成。

有沒有人對此有任何想法?

ps:它是一個大的結果集,包括行數(30K +)和列數(50 +列)。

您是否在比較獲得整個結果集的時間? 或者只是前N行?

你的謂詞是否過濾了99%的數據,使得一個查詢更難以獲得這N行?

流水線功能可能與它沒有任何關系。 您可以使用流水線函數並仍然檢索前N行而不評估整個結果集。 例如,下面的無限循環將在IDE中快速返回結果,該IDE僅檢索少量行。

create or replace type number_nt as table of number;

create or replace function pipe_function return number_nt pipelined is
begin
    while 1 = 1 loop
        pipe row(1);
    end loop;
end;
/

select column_value
from table(pipe_function)
where column_value < 2;

您可能需要添加有關函數和謂詞的更多詳細信息。

它獲取整個結果集以應用過濾器。

你應該改進MY_PIPLINED_FUNCTION。 可能現在它使用索引,因此first_rows速度很快。

1.您可以嘗試強制它使用哈希進行連接。(這可能會在更短的時間內獲得完整的結果集,但第一行不會很快出現)

2.您可以修改函數,並將函數放在函數的參數中,然后修改函數 - 從特定表中過濾行。 (IE而不是

select e.* from table(MY_PIPLINED_FUNCTION)e 
where e.name = 'mark'

去做

select e.* from table(MY_PIPLINED_FUNCTION('mark'))e 

這些東西可能有幫助......

暫無
暫無

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

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