IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[Tuning] Répartion d'element en ensemble.


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 11
    Points : 7
    Points
    7
    Par défaut [Tuning] Répartion d'element en ensemble.
    Bonjour,

    Je dois paralleliser des traitemantents. Cela consiste a metre un flag dans une colonne avec ne numero de processus qui va traiter les données.

    Existant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    DECLARE
     
    CURSOR c1 IS
    select arfcext,count(arfcext) as NB
    from v5.intart
    group by arfcext order by NB desc;
     
     
    TYPE tableau_numerique IS TABLE OF NUMBER(9) INDEX BY BINARY_INTEGER;
    Tab   tableau_numerique;
     
    indice NUMBER(2);
    i number (9);
    j number (9);
    min_val number (9);
    min_ind number (9);
    compt number (9);
     
    BEGIN
    DBMS_OUTPUT.ENABLE( 1000000 ) ;
    indice :=&1;
    i :=0;
    min_val:=0;
    min_ind:=0;
    compt:=0;
     
    for j in 0..indice-1 loop
    	Tab(j):=0;
    end loop;
     
    dbms_output.put_line( 'Indice de // :'||indice);
     
    FOR r1 IN c1 LOOP
     
    	if compt > 5000 then
    	min_ind:=0;
    	min_val:=Tab(0);	
    	for j in 1..indice-1 loop
    --		dbms_output.put_line( 'Indice val // :'||Tab(j)|| ' et min'||min_val);
    		if Tab(j) < min_val then
    		   min_val:=Tab(j);
    		   min_ind:=j;
    		end if;
    	end loop;
    	compt:=0;
    	COMMIT;
    	end if;
     
    	Tab(min_ind):=Tab(min_ind) + r1.NB;
        compt := compt + r1.NB ;
        update v5.intart set ARFUTIL =min_ind where arfcext=r1.arfcext;
     
    END LOOP;
     
    for j in 0..indice loop
    	dbms_output.put_line( 'Tab :'||Tab(j));
    end loop;
     
    end;
    /

    Je suis a la recherche d'optimisation car la il a beacoup d'"arfcext" avec un NB=1 ce qui fait enormente d'update unitaire et ce qui prend beacoup de temps.

    MERCI

  2. #2
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Vous nous parlez d'un problème d'algo mais vous ne nous présentez pas le moindre élément d'analyse (tables, relations, volumétries, but recherché, ...) mais simplement un bout de code....

    Si vous repartiez du début ? ;-)

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    MAJ du topic.

    J'espere etre plus comprehensible.

  4. #4
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 547
    Points : 670
    Points
    670
    Par défaut
    Il suffira d'extraire l'update unitaire de la boucle et de le deplacer apres la boucle pour le transformer en BULK UPDATE (FORALL UPDATE).

  5. #5
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Bonjour,


    Pouvez-vous expliquer en francais votre probleme ? Il s'agit d'affecter a chaque ligne un numéro de process qui va traiter la ligne en question.
    Si c'est le cas, vous pouvez utiliser la fonction ntile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    SQL> select 
      2    object_name, 
      3    ntile(4) over(order by object_name) process
      4  from
      5  (
      6    select object_name
      7    from   user_objects
      8    where  rownum <= 20
      9  )
     10  /
     
    OBJECT_NAME                    PROCESS
    ------------------------------ -------
    AITTRNTAU                            1
    AQ$TCORBAKQUETAU                     1
    AQ$TCORBAKTXPQUETAU                  1
    AQ$TCOREXCQUETAU                     1
    AQ$TCOREXCTXPQUETAU                  1
    AQ$TCORMSGQUETAU                     2
    AQ$TCORMSGTXPQUETAU                  2
    AQ$_TCORBAKQUETAU_E                  2
    AQ$_TCORBAKQUETAU_I                  2
    AQ$_TCORBAKQUETAU_T                  2
    AQ$_TCORBAKTXPQUETAU_E               3
    AQ$_TCORBAKTXPQUETAU_I               3
    AQ$_TCORBAKTXPQUETAU_T               3
    AQ$_TCOREXCQUETAU_E                  3
    AQ$_TCOREXCQUETAU_I                  3
    AQ$_TCOREXCQUETAU_T                  4
    AQ$_TCOREXCTXPQUETAU_E               4
    AQ$_TCOREXCTXPQUETAU_I               4
    AQ$_TCOREXCTXPQUETAU_T               4
    AQ$_TCORMSGQUETAU_E                  4
     
    20 rows selected.
     
    SQL>


    Laly.

Discussions similaires

  1. Regrouper en un ensemble les elements obtenus sequentiellement
    Par integrale dans le forum Général Python
    Réponses: 4
    Dernier message: 07/04/2013, 13h49
  2. Representer un ensemble d'elements
    Par Miko95 dans le forum Diagrammes de Classes
    Réponses: 4
    Dernier message: 13/03/2012, 11h16
  3. Réponses: 5
    Dernier message: 27/06/2008, 14h48
  4. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51
  5. Réponses: 3
    Dernier message: 12/06/2002, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo