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

PL/SQL Oracle Discussion :

Procédure trog longue


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Par défaut Procédure trog longue
    Bonjour,

    Je viens de terminer une procédure stockée de contrôle d'un table de chargement, c'est une page PHP qui devrait lancer l'exécution de de cette procédure : pb
    J'ai 30000 lignes avec pour chaque colonne 3 ou quatre contrôles dans diverses autres tables, elle fonctionne correctement mais prend 10 mn.
    Comment faire pour avoir un lancement détacher (process &) de la page Web ???

    Je suis en cours d'optimisation , avez vous un lien ou une idée de ce qui "doit être optimisé"

    olivier

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Comment faire pour avoir un lancement détacher de la page Web ???
    Pourriez-vous préciser le fond de votre pensée ?

  3. #3
    Membre Expert Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Par défaut Bonjour
    Précision,

    Si je fais un call maProcedure en php, la page va attendre la fin de l'exécution du script PL SQL ~ 15 mn, j'aurais forcément un time out de ma page ....
    il faudrait que je puisse lancer la procédure en tâche de fond
    comme exec & en unix.


    olivier

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    DBMS_JOB ou DBMS_SCHEDULER.
    Mais traiter "30000 lignes avec pour chaque colonne 3 ou quatre contrôles dans diverses autres tables" en 10 minutes il y a mieux à faire.

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Voici la procédure que j'utilise (sur une 9i) pour exécuter une procédure via un job:

    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
    CREATE OR REPLACE PROCEDURE Start_Job_XX
     (
       PC$Param1  IN VARCHAR2,
       PC$Param2  IN VARCHAR2,
       ....
     )
    IS
      PRAGMA AUTONOMOUS_TRANSACTION ;
      v_params   VARCHAR2(10000) ;
      v_jobid    NUMBER ;
      v1         VARCHAR2(1) :=  CHR(39) ;
      v2         VARCHAR2(2) := v1 || v1 ;
    BEGIN
      -------------------------------------------
      --  lancement du job en mode asynchrone  --
      -------------------------------------------
      v_params := 'begin Ma_procedure('''
               || REPLACE(PC$Param1, v1, v2)  || ''''
                   || ',''' || REPLACE(PC$Param2, v1, v2) || ''''
                   .....
                   || '); end;' ;               
      DBMS_JOB.SUBMIT (v_jobid, v_params);
      COMMIT ;
    EXCEPTION
      WHEN OTHERS THEN
        ....
    END ;
    /

  6. #6
    Membre Expert Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Par défaut
    Bonjour,

    Pour répondre à mnitu :
    "Mais traiter "30000 lignes avec pour chaque colonne 3 ou quatre contrôles dans diverses autres tables" en 10 minutes il y a mieux à faire."

    Je ne comprends pas vraiment t'as ( votre ) réponse ? ironie ...

    Après le Fonctionnement je passe à l'optimisation, je ne suis pas "expert PLSQL" oracle, c'est un métier .

    Si je comprends bien j'appelle une procédure Start_job qui en démarre une autre en mode asynchrone, donc c'est Oracle qui gére le temps .

    et Start_job se détache de la mienne .... pouf pouf faut savoir, comme quoi
    l'expérience

    En tout cas je vous remercie de vos réponses très réactives

    olivier

  7. #7
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    La procédure est en mode transaction autonome car elle contient un COMMIT.
    Effectivement, elle rend la main immédiatement à l'appelant, donc votre prog PHP.

    Si votre base est 10g ou mieux, utilisez plutôt DBMS_SCHEDULER à la place de DBMS_JOB.

  8. #8
    Membre Expert Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Par défaut Génial,
    Ok,

    Je comprends mieux le commit et mode PRAGMA AUTOMOMOUS_TRANSACTION ;

    Pour le reste, je vais chercher dans mon livre.

    Ok je teste .

    Mon dieu, vous m'enlever une épine, après mes tests je commençais à paniquer.
    NOus sommes en 9i la migration 10g pour plus tard m'a dis l'admin ...
    olivier

  9. #9
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Pour le reste, comme vous dites, il faudrait analyser le code. Néanmoins, nous rappelons fréquemment que le but du forum n'est pas le débogguage de code...

    Cependant, si vous donnez quelques infos de base sur votre traitement, on peut toujours donner quelques informations. Certaines structures de programmation utilisant des boucles imbriquées sont souvent consommatrices de ressources.

  10. #10
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par nathieb Voir le message
    Bonjour,

    Pour répondre à mnitu :
    "Mais traiter "30000 lignes avec pour chaque colonne 3 ou quatre contrôles dans diverses autres tables" en 10 minutes il y a mieux à faire."

    Je ne comprends pas vraiment t'as ( votre ) réponse ? ironie ...
    ...
    Bonjour,

    Non ce n’est pas du tout ironique (je ne me suis pas imaginé que vous allez le prendre comme ça ) ! C’était tout simplement pour vous inciter d'essayer d’optimiser le traitement. Sans savoir exactement ce que vous faite dans votre traitement toute conclusion est non fondée.
    D’autre parte analysez bien si vraiment vous avez besoin d’utiliser la transaction autonome ! Vous n’êtes pas du tout obligé de définir une transaction autonome pour utiliser DBMS_JOB.

  11. #11
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Citation Envoyé par mnitu Voir le message
    D’autre parte analysez bien si vraiment vous avez besoin d’utiliser la transaction autonome ! Vous n’êtes pas du tout obligé de définir une transaction autonome pour utiliser DBMS_JOB.
    DBMS_JOB.Submit() nécessite un COMMIT pour s'exécuter, et tout le monde connait l'implication d'un commit au beau milieu d'un traitement.
    Franchement, pourquoi courir un tel risque ?

  12. #12
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    DBMS_JOB.Submit() nécessite un COMMIT pour s'exécuter, et tout le monde connait l'implication d'un commit au beau milieu d'un traitement.
    Franchement, pourquoi courir un tel risque ?
    Il n’y rien qui nous oblige de faire un commit toute suite après avoir appelé DBMS_JOB.SUBMIT. Le commit peut se faire tranquillement à la fin de la transaction.
    Mais voilà un cas ou utiliser la solution que tu proposes pose des problèmes.
    Une procédure qui utilise une transaction autonome peut être appelé dans un trigger qui se déclanche en update. Mais si le update restart, le trigger va être ré exécuté et donc le job va être soumis deux fois ! Pourqoui courir un tel risque ?
    Donc l’utilisation de la procédure qui initialise la transaction autonome doit être fait judicieusement, quand c’est nécessaire et non pas automatiquement.

  13. #13
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Dans le cas présent, le Job semble devoir être lancé depuis le code PHP, et tout de suite, pas au moment d'un éventuel commit final.

  14. #14
    Membre Expert Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Par défaut
    mnitu, t'as réponse me rassure,. Je sais au fond que les intervenants de ce forum sont très bien .
    Effectivement je suis en train d'utiliser une méthode de traçage de ma procédure , pour identifier les goulots d'étranglements. D'ailleurs je viens de gagner 100 s.
    Je serais certainement obliger d'utiliser un DBMS_JOB, mais en tout cas j'essaye de faire mieux.


    olivier

Discussions similaires

  1. [XL-2007] Procédure trop longue
    Par presser dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/06/2009, 18h52
  2. Une procédure trop longue
    Par lola06 dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/05/2007, 14h02
  3. [Vba access 97] Procédure trop longue
    Par saufffy dans le forum Access
    Réponses: 6
    Dernier message: 26/02/2007, 10h40
  4. [ASE] Procèdure trop longue
    Par Benjamin78 dans le forum Sybase
    Réponses: 2
    Dernier message: 11/04/2006, 10h01
  5. [ASE][T-SQL]Procédure trop longue
    Par Benjamin78 dans le forum Sybase
    Réponses: 5
    Dernier message: 21/03/2006, 12h25

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