繁体   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