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 23/04/2007, 14h21   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 50
Points : 10
Points : 10
Par défaut lenteur insertion en masse

Bonjour,

Petit problème avec une base Oracle 10 (le même traitement sur une base Oracle 8i ne pose pas problème) :
- début transaction (logicielle, via prog Delphi)
- boucle 5000 fois insertion d'1 enreg dans table A
- 1 insertion du genre INSERT INTO B SELECT * FROM A (donc insertion en 1 fois de 5000 enreg.)
- COMMIT (fin transaction)

l'instruction INSERT prend 20 minutes !

Or, lorsque je me pointe sur la base pour tester les tables et d'autres insertions, tout baigne, aucun délai pour faire un insert de 5000 enreg. en une fois, les index sont OK, les Foreign Key aussi, bref ça prend une demi-seconde...

Je ne suis pas un pro d'Oracle, y a-t-il une différence entre 8i et 10 qui justifierait de faire un commit entre les 5000 insertions et l'insertion de 5000 enreg. en une fois ?

Merci pour toute idée !
zorino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 08h45   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Citation:
Je ne suis pas un pro d'Oracle, y a-t-il une différence entre 8i et 10 qui justifierait de faire un commit entre les 5000 insertions et l'insertion de 5000 enreg. en une fois ?
A priori, je dirais non. Les 2 bases sont-elles sur les même serveurs ? Si non, quel est le serveur censé être le plus rapide ? C'est peut-être un problème de charge temporaire sur le serveur qui héberge la base ? C'est peut-être un problème de configuration de la base. Mais sans analyse détaillée, il est impossible de résoudre un problème de performance. Si vous arrivez à reproduire ce problème, il faut analyser ce qui se passe en détail avec un outil comme la trace SQL et TKPROF par exemple.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 09h11   #3
cdu
Membre actif
 
Inscription : août 2004
Messages : 196
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 196
Points : 179
Points : 179
bonjour,
je dirai que si tu ne risques pas d'exploser ton rollbacksegment, l'insertion des 5000 puis le commit devrait être plus efficace.

ensuite, il faut s'interroger sur les données que tu veux insérer dans la table, sont elles au bout, réparties entre les données déja existantes ? dans ce cas voir le pctfree de la table

vérifie aussi qu'il n'y a pas de trigger ou d'index en plus

c'est un début ...
cdu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 14h56   #4
Membre actif
 
Inscription : décembre 2002
Messages : 438
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 438
Points : 169
Points : 169
Fait une trace + tkprof sur ton programme. Une fois j'ai découvert qu'il y avait un select entre 2 insert qui ralentissait l'execution.
Débéa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 09h09   #5
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 50
Points : 10
Points : 10
merci pour votre aide.

Je vais me renseigner pour Trace et TKProf (mais la base est chez le client et ça me paraît compliqué de leur demander ça...).

Il reste que c'est la même base qui est passée en Oracle 10, donc les données sont les mêmes, la répartition des index est donc aussi la même, etc...

Quand bien même il y aurait des SELECT inopportuns (il n'y en a pas), ils étaient là aussi avant, avec la base Oracle 8i...

Je pencherais plutôt, comme le suggère pifor, d'un problème de configuration de la base, mais lequel ?

Je vais tâcher de mettre la main sur le fichier de config et le poster ici car c'est un peu du chinois pour moi...
zorino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 09h59   #6
Membre actif
 
Inscription : décembre 2002
Messages : 438
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 438
Points : 169
Points : 169
Citation:
Envoyé par zorino
Quand bien même il y aurait des SELECT inopportuns (il n'y en a pas), ils étaient là aussi avant, avec la base Oracle 8i...
Il faut savoir que en 10g, il y a des statistiques automatiques. voir :
Code :
SELECT * FROM DBA_SCHEDULER_JOBS;
Si sur la 8i tu n'avais pas de stat, c'est le mode rule qui s'applique. Sur la 10g, c'est le mode ALL_ROWS. Dans le cas d'insertion massive, le plan de requête se met vite à déconner car les stats sont trop vieille.

J'ai fait du développement en Delphi quand j'étais jeune et quelque fois les composants delphi font une requête pour vérifier que les données en mémoire sont toujours ok.

Es-tu sûr qu'il y a une seul instruction insert ? Et pas 5000 avec un select entre chaque insert ???
Débéa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 19h46   #7
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 50
Points : 10
Points : 10
Citation:
Envoyé par Débéa
Es-tu sûr qu'il y a une seul instruction insert ? Et pas 5000 avec un select entre chaque insert ???
oui, certain.
C'est un INSERT INTO... SELECT ( ), lequel SELECT renvoie les 5000 lignes.
zorino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 20h43   #8
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
Salut,
est-ce que les contraintes, les indexes, les triggers et tout le toutim sont STRICTEMENT identiques sur les 2 bases ?

imagine un trigger qui serait "after statement" sur la 8i et "for each row" sur la 10 g... bonjour les dégats !

autre chose, est-ce que le contexte opérationnel est le même dans les 2 cas ? je veux dire que les triggers ou les contraintes sont activés (ou désactivés) dans les 2 cas de figures de manière identique ?

et le Select tout seul (tu nous parles d'un insert-select), as-t'il les mêmes perf sur les 2 bases, auquel cas le problème vient bien de l'insertion elle même... ou est-ce que le Select lui-même provoque des performances très différentes ?

quid des statistiques sur les tables... elles sont à jours ? des 2 côtés ?
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa 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 10h30.


 
 
 
 
Partenaires

Hébergement Web