首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流水线函数

流水线函数
EN

Stack Overflow用户
提问于 2010-03-11 22:14:07
回答 1查看 807关注 0票数 0

谁能提供一个在oracle pl/sql中如何使用并行表函数的例子?我们需要运行15年的大规模查询并合并结果。

代码语言:javascript
复制
SELECT * 
  FROM Table(TableFunction(cursor(SELECT * FROM year_table))) 

有效地...is我们想要的东西。最里面的select将给出所有年份,表函数将获取每个年份并运行大量查询并返回一个集合。我们的问题是,所有年份都被提供给一个表函数本身,我们更希望每年都并行调用该表函数。我们尝试了所有类型的按散列和范围进行分区,但都没有帮助。

另外,我们可以从函数声明中删除关键字PIPELINED吗?因为我们不执行任何转换,只需要结果集的聚合。

EN

回答 1

Stack Overflow用户

发布于 2010-03-12 09:04:20

有一个很好的写here

还有其他的方法(例如,一个“主”任务,通过YEAR_TABLE进行游标,并每年提交一个DBMS_JOB进行处理。每个“年度作业”都会将其结果插入到一个表中。

一旦所有派生的作业完成,您只需从表中提取结果即可。

PS。我怀疑并行流水线不会做你想要的事情。我创建了一个很大的表,只有三行和一个特定值。然后,我创建了一个并行流水线函数,它只是将正在执行的进程的SID (见下文)及其处理的行数推送出去。我有一个SQL,它挑选出这三行,并将其作为游标传递给函数。大多数情况下,该函数推出两个不同的SID(这是EXPLAIN PLAN告诉我它选择的并行度)。有时它显示已执行了两个进程,但所有三行都是由其中一个进程处理的。

因此,并不是从游标中挑选行并将其传递给并行从机进行处理,而是为每个并行进程分配一片驱动表进行处理。对于小表,它可能不会考虑并行,即使它考虑并行,它也可能只将前50行分配给第一个进程等。

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION test_pp(p_source     IN SYS_REFCURSOR)
   RETURN TAB_CHAR_4000  PIPELINED
   PARALLEL_ENABLE (PARTITION p_source BY ANY)
IS
   v_num NUMBER;
BEGIN
   FETCH p_source INTO v_num;
   WHILE p_source%FOUND LOOP
            PIPE ROW(sys_context('USERENV','SID'));
            FETCH p_source INTO v_num;
   END LOOP;
     PIPE ROW(sys_context('USERENV','SID')||':'||p_source%ROWCOUNT);
   CLOSE p_source;
   RETURN;
END test_pp;
/
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2425578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档