2010-03-11 2 views
0

Quelqu'un peut-il donner un exemple d'utilisation de la fonction de table parallèle dans oracle pl/sql. Nous devons lancer des requêtes massives pendant 15 ans et combiner le résultat.fonction pipelined

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

... est ce que nous voulons efficacement. La sélection la plus interne donnera toutes les années, et la fonction table prendra chaque année et exécutera une requête massive et retournera une collection. Le problème que nous avons est que toutes les années sont alimentées par une fonction de table, nous préférons que la fonction de table soit appelée en parallèle pour chaque année. Nous avons essayé toutes sortes de partitionnement par hachage et gamme et cela n'a pas aidé.

En outre, pouvons-nous supprimer le mot-clé PIPELINED de la déclaration de fonction? parce que nous n'effectuons aucune transformation et n'avons besoin que de l'agrégat du resultset.

+1

Pouvez-vous décrire ce que vous essayez d'atteindre et pourquoi vous Vous pensez avoir besoin d'une fonction de pipeline? À l'heure actuelle, il semble que vous deviez exécuter une requête pour chaque année. –

+0

Même si nous exécutons une requête par an, nous avons besoin que cela se produise en parallèle pour toutes les périodes de l'année. S'il y a une meilleure option que d'utiliser pipelining parallèle s'il vous plaît suggérer. – Prakash

Répondre

2

Il existe une excellente description here.

Il existe des approches alternatives (par exemple, un travail « maître » que les curseurs par YEAR_TABLE et soumet un DBMS_JOB pour traiter chaque année. Chaque « job année » insérerait ses résultats dans une table.

Une fois que tous les travaux générés dynamiquement sont finis, vous venez de tirer les résultats de la table.

PS. Je soupçonne parallèle ne fera pas pipelinée ce que vous voulez bien. J'ai créé une grande table avec seulement trois lignes avec une valeur spécifique. je puis créé une fonction pipelined parallèle qui vient d'exclure le SID du processus d'exécution (voir ci-dessous) et le nombre de lignes qu'il traite J'ai eu un SQL qui a choisi ces trois rangées, et passé cela comme le curseur dans la fonction. Principalement, la fonction a poussé deux SID différents (ce qui est ce que EXPLAIN PLAN m'a dit qu'il a choisi comme degré de parallélisme). Parfois, il montre que deux processus ont été exécutés, mais les trois lignes ont été traitées par l'un de ces processus.

Ainsi, les lignes ne seront pas sélectionnées par le curseur et transmises aux esclaves parallèles à traiter, mais chaque processus en parallèle recevra une partie de la table de pilotage à traiter. Avec une petite table, il ne serait probablement pas considérer parallèle et même si elle l'a fait, il peut juste affecter les 50 premières lignes au premier processus, etc.

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