Lösung: Viele Hierarchien gleichzeitig navigieren

Zuerst Legen wir die nötigen Indexe an:


create index i1 on tree_emp( empno);
create index i2 on tree_emp( mgr);

Dannach definieren wir das pipe table package. Natürlich geht es auch effizienter, aber ich möchte hier das Prinzip zeigen.


create or replace package parallel_access
as

   TYPE R_REC IS RECORD (empno tree_emp.empno%TYPE,
   sum_salaries Number); -- result record, change defintion according to your needs
   TYPE refcur_t IS REF CURSOR RETURN R_REC;

   TYPE result_Tab is TABLE OF R_REC;

   FUNCTION passData (p_ref refcur_t) RETURN result_Tab
   PIPELINED
   PARALLEL_ENABLE(PARTITION p_ref BY ANY); -- function will inherit parallelism from ref cursor

END parallel_access;
/

create or replace package body parallel_access
as
   FUNCTION passData (p_ref refcur_t) RETURN result_Tab
   PIPELINED PARALLEL_ENABLE(PARTITION p_ref BY ANY)
   IS
      out_rec r_rec;
   BEGIN
      execute immediate 'alter session set "_old_connect_by_enabled"=true';
      LOOP -- for each parallel process
      FETCH p_ref INTO out_rec;
      EXIT WHEN p_ref%NOTFOUND;
         SELECT sum(sal)
           INTO out_rec.sum_salaries
           FROM tree_emp
        CONNECT BY PRIOR EMPNO = MGR
          START WITH mgr = out_rec.empno;

      PIPE ROW(out_rec);
   END LOOP;
   RETURN;
END passData;

END parallel_access;
/

Verwenden Können wir as Package wie folgt. Parallel 4 ist nur ein Beispiel, man kann die Parallelität je nach Bedarf wählen.


SELECT b.* FROM
          TABLE(parallel_access.passdata (CURSOR( 
           select /*+ parallel (d 4) */ empno , 
                  null 
           from tree_emp 
          where mgr is null))) b;
Advertisements

Kommentar verfassen

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s