簡體   English   中英

流水線功能

[英]pipelined function

有人可以提供一個示例,說明如何在oracle pl / sql中使用並行表功能。 我們需要運行15年的大量查詢並將結果組合起來。

SELECT * 
  FROM Table(TableFunction(cursor(SELECT * FROM year_table))) 

...是我們有效地想要的。 最里面的select將給出所有年份,而table函數將每年使用並運行大量查詢並返回一個集合。 我們遇到的問題是,所有年份都被饋送到一個表函數本身,我們寧願選擇每年每年並行調用該表函數。 我們嘗試通過哈希和范圍進行各種分區,但沒有幫助。

另外,我們可以從函數聲明中刪除關鍵字PIPELINED嗎? 因為我們不執行任何轉換,而只需要結果集的匯總。

有一個很好的寫了這里

還有其他方法(例如,通過“ YEAR_TABLE”游標並提交一個DBMS_JOB來每年處理的“主”工作。每個“年”工作都將其結果插入表中。

一旦完成所有產生的作業,您就可以從表中提取結果。

PS。 我懷疑並行管道無法完成您想要的操作。 我創建了一個大表,其中只有三行具有特定值。 然后,我創建了一個並行管道函數,該函數只是推出了正在執行的進程的SID(請參見下文)及其處理的行數。 我有一個SQL可以選擇這三行,並將其作為游標傳遞給函數。 通常,該函數推出了兩個不同的SID(這是EXPLAIN PLAN告訴我的,它被選為並行度)。 有時,它表明已經執行了兩個進程,但是所有三行都由其中一個進程進行了處理。

因此,不是從游標中提取行並將其傳遞給並行從站進行處理,而是在每個並行進程中分配一部分驅動表來處理。 對於一個小表,它可能不會考慮並行,即使這樣做,也可能只將前50行分配給第一個進程,等等。

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;
/

暫無
暫無

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

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