在Pipelined函数上的Oracle Query工作正常,但是如果我添加一个条件则会窒息

时间:2012-03-14 13:07:23

标签: sql oracle plsql oracle11g

我有一个pipelind函数,它返回一组自定义对象,即一个嵌套表。

效果很好(< 4秒)当我从中选择它时;

select e.* from table(MY_PIPLINED_FUNCTION)e

但是当我添加任何条件(where rownum<X除外)时,查询将永远执行(例如5分钟以上),但确实会正确返回所需的值结束

令我难以置信的是 正在工作,但需要花费大量时间才能完成。

有没有人对此有任何想法?

p.s。:这是一个很大的结果集,包括行数(30K +)和列数(50 +列)。

2 个答案:

答案 0 :(得分:3)

您是否在比较获得整个结果集的时间?或者只是前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;

您可能需要添加有关函数和谓词的更多详细信息。

答案 1 :(得分:1)

获取整个结果集以应用过滤器。

您应该改进MY_PIPLINED_FUNCTION。可能现在它使用索引,因此first_rows很快就会出现。

1.您可以尝试强制它使用哈希进行连接。(这可能会在更短的时间内获得完整的结果集,但第一行不会很快出现)

2.您可以修改函数,并将contiditions放在函数的参数中,从而修改函数 - 从特定表中过滤行。 (IE而不是

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

要做

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

这些事情可能有所帮助......