Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/07/2007, 14h25   #1
Invité de passage
 
Inscription : juillet 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 5
Points : 0
Points : 0
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 :
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
galoi81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 14h33   #2
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
- Mettre les balises [CODE] afin de rendre le code plus lisible

- Eviter d'être péremptoire !
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 14h44   #3
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Deja, tu fais trois fois le meme appel
Code :
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 :
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
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 15h27   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 217
Points : 4 217
Je crains que tu n'ais tord Garuda
Code :
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))
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 15h43   #5
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Effectivement, mea culpa !

Pourtant, je continue à penser que c'est ces trois appels à des fonctions basées qui doivent poser pb !
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 15h46   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 217
Points : 4 217
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.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 15h56   #7
Invité de passage
 
Inscription : juillet 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 5
Points : 0
Points : 0
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.
galoi81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 16h00   #8
Invité de passage
 
Inscription : juillet 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 5
Points : 0
Points : 0
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 :
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
     ) ;
galoi81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 16h00   #9
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
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é )
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 16h03   #10
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 217
Points : 4 217
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 ?
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 16h05   #11
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 217
Points : 4 217
Quand tu parles de la partie du SELECT c'est tout le SELECT n'est ce pas, pas le SELECT du FROM (SELECT)?
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 16h07   #12
Invité de passage
 
Inscription : juillet 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 5
Points : 0
Points : 0
oui tout le select prend 1.5 min
galoi81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2007, 21h03   #13
Membre actif
 
Inscription : février 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 167
Points : 161
Points : 161
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
Pozzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2007, 22h18   #14
Invité de passage
 
Inscription : juillet 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 5
Points : 0
Points : 0
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é.
galoi81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2007, 16h10   #15
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 217
Points : 4 217
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.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h17.


 
 
 
 
Partenaires

Hébergement Web