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 :

Problème lors de l'insertion de données


Sujet :

Oracle

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Problème lors de l'insertion de données
    Bonjour tout le monde,
    J'ai là un problème d'insertion de donnée.
    l'insertion se fait comme ceci :
    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
    insert into contrat16.TEST_LTD(COMMANDE, COL_ELT, COL_SERV, DELAI_MOY_COM, PER_GEL, DATE_CREATION, 
    DATE_CREATION_LTDT, DATE_PRE, DATE_PREQUA_LTDT, FLAG_COMMANDE_REAL, DATE_QUALIF, DATE_QUALIF_LTDT)	   
    SELECT COMMANDE,
           NULLIF(DELAI_MOY_ELT_SRV,-1) COL_ELT,
           NULLIF(DELAI_MOY_SRV,-1) COL_SERV,
           NULLIF(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),-1) DELAI_MOY_COM,
    	   PER_GEL,
    	   DATE_CREATION,
    	   decode(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),-1,null,Pkg_Calc_Order_Lt.F_Calc_date(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),DATE_CREATION)) DATE_CREATION_LTDT,
    	   DATE_PRE,
    	   decode(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),-1,null,Pkg_Calc_Order_Lt.F_Calc_date(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),DATE_PRE)) DATE_PREQUA_LTDT,
    	   decode(DATE_PRE,null,1,0) flag_commande_real,
    	   DATE_QUALIF,
    	   decode(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),-1,null,Pkg_Calc_Order_Lt.F_Calc_date(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),DATE_QUALIF)) DATE_QUAlIF_LTDT
    FROM (	   
          SELECT  A.ID_COMMANDE COMMANDE, 
                  PKG_CALC_ORDER_LT.F_CALC_ELT_SRV_LEAD_TIME(B.ID_OPERATION,A.ID_COMMANDE,'CONTRAT16') DELAI_MOY_SRV,
          	      PKG_CALC_ORDER_LT.F_CALC_SRV_LEAD_TIME(B.ID_OPERATION,A.ID_COMMANDE,'CONTRAT16') DELAI_MOY_ELT_SRV,
          	      CAL_PERIODE_GEL('CONTRAT16',A.ID_COMMANDE) PER_GEL,
          	      A.DATE_CREATION DATE_CREATION,
          	      CAL_DATE_PREQUALIF('CONTRAT16',A.ID_COMMANDE) DATE_PRE,
          	      CAL_DATE_QUALIF('CONTRAT16',A.ID_COMMANDE) DATE_QUALIF
          FROM    CONTRAT16.PC_COMMANDE A ,CONTRAT16.PC_GROUPEMENT_COMMANDE B
          WHERE   A.TYPE_COMMANDE NOT IN (3,4,5,10,11,12,13) AND A.FLAG_INJECTION <> 1
          AND     A.ID_GROUPEMENT=B.ID_GROUPEMENT
         ) ;
    il s'agit là d'une requête lourde (la partie select) que je veux inserer dans une table. L'execution de la seule partie select prend à peu prés 1,5 min.
    le problème est que je n'arrive pas à comprendre pourquoi l'insertion ne se fait pas (ça tourne sans faire d'insertion)
    si quequ'un a une piste c'est urgent?
    Merci d'avance

  2. #2
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    - Mettre les balises [CODE] afin de rendre le code plus lisible

    - Eviter d'être péremptoire !

  3. #3
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Deja, tu fais trois fois le meme appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    decode(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),-1,null,Pkg_Calc_Order_Lt.F_Calc_date(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),DATE_PRE))
    Mets ce calcul dans le "FROM (SELECT"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    INSERT ....
    SELECT
    ...
    Calcul,
    ....
    calcul,
    ....
    FROM (select ...
    decode(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),-1,null,Pkg_Calc_Order_Lt.F_Calc_date(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),DATE_PRE)) calcul
    ...
    A mon avis, c'est cet appel (qui n'est pas dans ton select) qui est gourmand en ressources

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Je crains que tu n'ais tord Garuda
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECODE(GREATEST(delai_moy_elt_srv,delai_moy_srv),-1, NULL,
    	PKG_CALC_ORDER_LT.F_CALC_DATE(
    	GREATEST(delai_moy_elt_srv,delai_moy_srv), date_creation)),
    DECODE(GREATEST(delai_moy_elt_srv,delai_moy_srv),-1,NULL,
    	PKG_CALC_ORDER_LT.F_CALC_DATE(
    	GREATEST(delai_moy_elt_srv,delai_moy_srv), date_pre)),
    DECODE(GREATEST(delai_moy_elt_srv,delai_moy_srv),-1,NULL,
    	PKG_CALC_ORDER_LT.F_CALC_DATE(
    	GREATEST(delai_moy_elt_srv,delai_moy_srv), date_qualif))

  5. #5
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Effectivement, mea culpa !

    Pourtant, je continue à penser que c'est ces trois appels à des fonctions basées qui doivent poser pb !

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pour moi si le SELECT met 2 minutes à s'exécuter réellement, le problème vient de la table TEST_LTD.

    Des triggers dessus ?

    Sinon, sans volumétrie, explication des functions de calcul, explain plan et autres, on ne va pouvoir faire que des suppositions.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Re bonjour,
    juste pour comprendre:
    la clause fonctionne comme suit:
    dans un 1er temps oracle execute la partie du select, le resultat est stocké dans la RAM puis il enchaine sur l'insertion.
    Maitenant, ma requête prend 1.5 min à s'executer (la partie du select). Le nombre de rows retournés est environ 30000. Ce que je sais c'est que un tel nombre est rapidement inseré dans une table.
    je n'arrive pas à comprendre pourquoi ça marche pour une insertion normale ne comportant pas de fonction alors que c'est un KO pour la mienne.
    merci de me corriger si je me trompe.

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Re bonjour,
    juste pour comprendre:
    la clause fonctionne comme suit:
    dans un 1er temps oracle execute la partie du select, le resultat est stocké dans la RAM puis il enchaine sur l'insertion.
    Maitenant, ma requête prend 1.5 min à s'executer (la partie du select). Le nombre de rows retournés est environ 30000. Ce que je sais c'est que un tel nombre est rapidement inseré dans une table.
    je n'arrive pas à comprendre pourquoi ça marche pour une insertion normale ne comportant pas de fonction alors que c'est un KO pour la mienne.
    merci de me corriger si je me trompe.

    pour ma requête la voici et je m'excuse pour l'ancien format:
    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
    insert into contrat16.TEST_LTD (COMMANDE, COL_ELT, COL_SERV, DELAI_MOY_COM, PER_GEL, DATE_CREATION, 
    DATE_CREATION_LTDT, DATE_PRE, DATE_PREQUA_LTDT, FLAG_COMMANDE_REAL, DATE_QUALIF, DATE_QUALIF_LTDT)	   
    SELECT COMMANDE,
           NULLIF(DELAI_MOY_ELT_SRV,-1) COL_ELT,
           NULLIF(DELAI_MOY_SRV,-1) COL_SERV,
           NULLIF(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),-1) DELAI_MOY_COM,
    	   PER_GEL,
    	   DATE_CREATION,
    	   decode(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),-1,null,Pkg_Calc_Order_Lt.F_Calc_date(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),DATE_CREATION)) DATE_CREATION_LTDT,
    	   DATE_PRE,
    	   decode(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),-1,null,Pkg_Calc_Order_Lt.F_Calc_date(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),DATE_PRE)) DATE_PREQUA_LTDT,
    	   decode(DATE_PRE,null,1,0) flag_commande_real,
    	   DATE_QUALIF,
    	   decode(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),-1,null,Pkg_Calc_Order_Lt.F_Calc_date(GREATEST(DELAI_MOY_ELT_SRV,DELAI_MOY_SRV),DATE_QUALIF)) DATE_QUAlIF_LTDT
    FROM (	   
          SELECT  A.ID_COMMANDE COMMANDE, 
                  PKG_CALC_ORDER_LT.F_CALC_ELT_SRV_LEAD_TIME(B.ID_OPERATION,A.ID_COMMANDE,'CONTRAT16') DELAI_MOY_SRV,
          	      PKG_CALC_ORDER_LT.F_CALC_SRV_LEAD_TIME(B.ID_OPERATION,A.ID_COMMANDE,'CONTRAT16') DELAI_MOY_ELT_SRV,
          	      CAL_PERIODE_GEL('CONTRAT16',A.ID_COMMANDE) PER_GEL,
          	      A.DATE_CREATION DATE_CREATION,
          	      CAL_DATE_PREQUALIF('CONTRAT16',A.ID_COMMANDE) DATE_PRE,
          	      CAL_DATE_QUALIF('CONTRAT16',A.ID_COMMANDE) DATE_QUALIF
          FROM    CONTRAT16.PC_COMMANDE A ,CONTRAT16.PC_GROUPEMENT_COMMANDE B
          WHERE   A.TYPE_COMMANDE NOT IN (3,4,5,10,11,12,13) AND A.FLAG_INJECTION <> 1
          AND     A.ID_GROUPEMENT=B.ID_GROUPEMENT
         ) ;

  9. #9
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    1) Parce qu'un appel à une fonction n'est pas neutre en terme de ressources
    2) Parce que tu ne maitrises pas ce qui se passe à l'interieur de celle_ci (qui peut etre fort compliqué )

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Sur la façon dont Oracle gère l'INSERT je ne suis pas sur qu'il stocke tout le résultat dans la RAM pour après gérer l'insertion.

    1/ Es-tu sur que c'est 1.5 minutes pour fetcher tous les résultats ?
    2/ Quels sont les triggers de ta table d'insertion ?

  11. #11
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Quand tu parles de la partie du SELECT c'est tout le SELECT n'est ce pas, pas le SELECT du FROM (SELECT)?

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    oui tout le select prend 1.5 min

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 281
    Points
    281
    Par défaut
    Salut,

    En fait la requête select elle même n'a pas d'importance puisque tu dis qu'elle retourne les données en 1.5 minutes. On peut toujours essayer de tuner mais le soucis est que ça ne veut pas s'insérer dans la test_ltd.

    Tout est dans le "ça ne s'insère pas". Ca peut être lent ou ne pas se faire ce qui est différent.
    Admettons que tu laisses la requête tourner 24H.
    Si rien n'est inséré je vois OU des triggers sur la table cible OU une session concurrente qui locke la table cible.
    Pour dépister ça je prendrais une seule ligne retournée par le select et je ferais un insert values histoire d'en avoir le coeur net.

    Si au contraire au bout de 24 heures ça a marché c'est plutôt un soucis de lenteur. Là ce serait plutôt OU un trigger sur la table cible qui réalise des opérations lourdes, OU peut-être une taille des journaux qui serait trop faible.

    Combien de temps a tourné ta requête sans rien insérer ?

    Pozzo

  14. #14
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    bonsoir tt le monde
    en fait j'ai fait le test avec un seul row (where rownum=1) et l'insertion a été fait au bout de 24s.un autre truc que je ne comprend pas et voici le detail:
    je travaille avec toad et comme je l'ai mentionné la requête fait 1,5 pour s'executer. lorsque je mais un count record(option de toad) pour savoir le nombre de rows retournés il affiche le bon nombre comme quoi il a effectué le calcul pour tous les rows ( la table principale est pc_commande qui a 28000 lignes et ma requete affiche bien ce nombre du coup le calcul a été fait pour l'ensemble des lignes). lorsque je voulais descendre dans l'affichage pour voir d'autre lignes ça se bloque et il ne donne l'impression qu'il re-execute la requête. En fai ce n'est pas comme un select ordinaire ou je peut aller dans l'affichage du resultat consulter les 'enregistrement retourné sans que toad se bloque. Merci les gas de votre aide. une chose je travaille sur un projet et malheureusement cette requête est la base de tous calculs à effectuer
    merci encore de votre gentillesse et votre réactivité.

  15. #15
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    L'avantage de TOAD, c'est qu'il fait des fetch de 25 lignes (par curseur).
    Donc dès que tu veux afficher les 25 suivantes, il recontinue son curseur et fetche les 25 lignes suivantes.

    Donc c'est 1.5min pour les 25 premières lignes.

    Va falloir nous poster toutes les fonctions appelées par ta requete.
    Ce sont elles qu'il va falloir optimiser.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/03/2010, 13h31
  2. [MySQL] probléme lors de l'insertion dans ma base de données
    Par fofina dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/10/2007, 10h47
  3. [SQL] Problème lors de l'insertion d'un enregistrement dans ma base de données.
    Par Velkan.nexus dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/10/2007, 11h59
  4. Réponses: 3
    Dernier message: 26/04/2006, 08h16
  5. [JDesktopPane] Problème lors de l'insertion d'une JInternalFrame
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 21/09/2005, 01h38

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