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 :

optimisation avec vue dynamique


Sujet :

Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut optimisation avec vue dynamique
    Bonjour,

    Afin d'optimiser un traitement, je souhaite créer une vue dynamiquement au début de celui ci (je ne peux pas la créer avant car elle utilise des paramètres du traitement ), mais je ne suis pas convaincu de l'efficacité.
    un expert peut il me donner son avis?

  2. #2
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    salut,
    tu peux nous en dire un peu plus STP ?
    c'est pour faire quel type de traitement ?

    suivant le cas, tu es sûr de devoir faire une vue, et pas juste du SQL dynamique ?

    un petit exemple en passant d'une procédure avec du SQL dynamique, c'est une procédure qui renvoie un curseur à l'application en réponse à un écran de recherche, en fonction des paramètres (critères de recherche) entrés par l'utilisateur...

    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
    62
    Procedure SearchCursor (
                            pd_DateFrom     IN      Date        ,
                            pd_DateTo       IN      Date        ,
                            pn_BillType     IN      Number      ,
                            pn_BillStatus   IN      Number      ,
                            pn_PeriodMaster IN      Number      ,
                            RetCursor       OUT     sys_refcursor
                           )
    Is
        vSQL                                Long ;
     
    Begin
     
        vSQL :=     'Select '
                ||          'VDBillHeader_i '
                ||          ', VDBillTypologyClassItem.FGetTypologyClassItemCode(T_BillType_i) as BILLTYPE '
                ||          ', VDBillTypologyClassItem.FGetTypologyClassItemCode(T_BillStatus_i) as BILLSTATUS '
                ||          ', DateFrom '
                ||          ', DateTo '
                ||          ', decode(IsPeriodMaster '
                ||                  ', 0 '
                ||                  ', ''Non'' '
                ||                  ', 1 '
                ||                  ', ''Oui'' '
                ||                  ')                     as LASTBILL '
                ||          ', BillComment '
                ||  'From    VDBillHeader '
                ||  'Where   1 = 1 ' ;
     
        If pd_DateFrom is not Null
        Then
            vSQL := vSQL
                ||  'And    DateFrom = '''|| pd_DateFrom ||''' ' ;
        End If ;
     
        If pd_DateTo is not Null
        Then
            vSQL := vSQL
                ||  'And    DateTo = '''|| pd_DateTo ||''' ' ;
        End If ;
     
        If pn_BillType is not Null
        Then
            vSQL := vSQL
                ||  'And    T_BillType_i = '|| pn_BillType ||' ' ;
        End If ;
     
        If pn_BillStatus is not Null
        Then
            vSQL := vSQL
                ||  'And    T_BillStatus_i = '|| pn_BillStatus ||' ' ;
        End If ;
     
        If pn_PeriodMaster is not Null
        Then
            vSQL := vSQL
                ||  'And    IsPeriodMaster = '|| pn_PeriodMaster ||' ' ;
        End If ;
     
        Open RetCursor for vSQL ;
     
    End SearchCursor ;

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    créer une vue dynamiquement... chez moi ça veux dire faire du SQL dynamique... non ?

  4. #4
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    diantre Fed !
    tu me coupe l'herbe sous le pied pendant que j'édite / complète ma réponse !!

  5. #5
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    les grands esprits se rencontrent

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut
    au départ, j'avais une boucle dans laquelle j'appelais 2 curseurs, chaque curseur durant 1 à 2 s * par 10 000 occurences soit une dixaine d'heure. j'ai donc essayé de créer 2 vues et de remplacer mes 2 curseurs par un simple select * from vue...mais je n'ai pas l'impression que ça fonctionne (je n'ai pas fini de tester)

  7. #7
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    et si tu nous expliquais un peu ta problématique ?
    parce que là, sans infos...

  8. #8
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    avec le code ça pourrait aider aussi

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut
    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
    PROCEDURE xxx
    	AS
    		CURSOR cur1( param)
    			IS SELECT  ... 
    		      ;
     
    		CURSOR cur2( param)
    	    IS  SELECT ...
    	      ;
     
    		cursor cur3
    			is SELECT ... 
           ;
     
    		BEGIN
    			OPEN cur3;
    				LOOP
    					FETCH cur3
    					BULK COLLECT INTO table3;
    					Exit When cur3t%NOTFOUND ;
     				end loop;
    			CLOSE cur3;
     
    		For n In 1..table3  
    		loop
     			OPEN cur1(table3.param);
     				LOOP
     					FETCH cur1
     					BULK COLLECT INTO table1;
     					Exit When cur1%NOTFOUND ;
     				end loop;
     				close cur1;
     
     
    				OPEN cur2(table3.param );
     				  LOOP
    						FETCH cur2
    						BULK COLLECT INTO table2;
    						Exit When cur2%NOTFOUND ;
    					end loop;
    					close cur2;
     
             traitement....     
     
    			end loop;
    END xxx;
    j'ai essayé de remplacer transformer les requêtes de cur1 et cur2 par des vues dynamique (car elle utilise des paramètres du traitement) créées avant la boucle, puis dans cur1 et cur2, j'ai mis select * from vue.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut
    j'utilise oracle 9i (9.2.0.3.0)

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut
    et les 3 requêtes des curseurs sont déjà optimisées

  12. #12
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    OK...
    je pars du principe que table 1, 2 et 3 sont variables de type tableau du curseur%Rowtype...

    donc tu n'as pas besoins d'un loop pour charger le tableau depuis le curseur ! c'est justement pour ça que le Bulk collect existe !

    essaye sans les loop, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Open cur3 ;
    Fetch cur3 BULK COLLECT into Table3 ;
    Close cur3;

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut
    je n'avais pas vu (ce n'est pas moi qui ai écris le code), cependant, j'ai besoin de récupérer le nb enreg ramené par le cur2. J'avais un compteur dans le fecth du cur2

  14. #14
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    tu peux le récupérer après coup depuis le tableau idoine, avec la méthode COUNT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nLeNombre := Table2.count ;

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Open cur3 ;
    Fetch cur3 BULK COLLECT into Table3 ;
    compteur = sql%rowcount
    Close cur3;
    ca marche?

    autre question, le tableau est réinitialisé à chaque fetch?

  16. #16
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    on s'est croisé, voir au-dessus !

    pour la réinitialisation, non il n'est initialisé automatiquement...

    soit tu utilise 3 tableau différents, ou situ veux le remplir, l'utiliser, PUIS re-remplir le même avec d'autres données (de même structure), tu dois le vider avec la méthode Tableau.Delete

    dans ton cas, pour le tableau Table3 :

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut
    et la vue dynamique c'est intéressant ou pas?

  18. #18
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    non...
    tu vas créer une vue, donc l'insérer dans le dictionnaire de données, juste pour utiliser le Select qu'elle contient puis la dropper, donc re-modifier le dictionnaire de données...

    autant utiliser uniquement le Select et s'épargner la création - suppression d'objet !

  19. #19
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Citation Envoyé par ljoly
    et la vue dynamique c'est intéressant ou pas?
    Une vue, ce n'est jamais qu'une requête stockée, donc il ne faut pas compter la dessus pour optimiser quoi que ce soit...

Discussions similaires

  1. [syntaxe]Creation table avec nom dynamique
    Par ZuZu dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/09/2004, 18h01
  2. Creation d'une vue dynamique ?
    Par Simeans2004 dans le forum Administration
    Réponses: 5
    Dernier message: 01/07/2004, 15h25
  3. [Plugin] Création d'une vue dynamiquement
    Par The Bonze dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 15/06/2004, 13h23
  4. Conf DNS pour serveur mail avec IP dynamique ?
    Par ovh dans le forum Réseau
    Réponses: 9
    Dernier message: 14/06/2004, 22h55
  5. Réponses: 12
    Dernier message: 26/04/2004, 08h32

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