我有一个pipelind函数,它返回一组自定义对象,即一个嵌套表。
效果很好(< 4秒)当我从中选择它时;
select e.* from table(MY_PIPLINED_FUNCTION)e
但是当我添加任何条件(where rownum<X
除外)时,查询将永远执行(例如5分钟以上),但确实会正确返回所需的值结束。
令我难以置信的是 正在工作,但需要花费大量时间才能完成。
有没有人对此有任何想法?
p.s。:这是一个很大的结果集,包括行数(30K +)和列数(50 +列)。
答案 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
)
这些事情可能有所帮助......