|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : janvier 2005 Messages : 34 ![]() |
Bonjour à tous,
Je travail sur une petite application censée utiliser les données d'un planning prévisionnel de prospecteur/client. Cette application doit régulièrement interroger la table de planning pour savoir si chacun des prospecteur se rend bien à ses rendez-vous. J'ai plusieurs tables a utiliser (ces tables me sont imposées, je ne peux qu'ajouter des champs mais je ne peux ni changer leurs liaisons, ni enlever des éléments) : planning : table des rendez-vous prospect : table des prospecteurs (salariés) detail_prospect : table donnant des informations complémentaires sur les prospecteurs. client : table des clients detail_client : table donnant des informations complémentaires sur les clients produit : table de produits présentés J'ai donc construit la requête suivante : Code :
Il faut savoir que simultanément le planning prévisionnel évolue (ajout de rdv, suppression de rdv, modification de rdv, validation d'un RDV quand prospect confirme son arrivé chez un client). J'avoue que je ne savais pas vraiment dans quelle catégorie poster cette demande, j'espère avoir choisi la bonne catégorie. Je ne m'y connais pas en paramétrage de base... (juste en développement) J'ai remarqué que la commande : analyze table planning compute statistics; Améliore le traitement mais très rapidement le traitement ralentit de nouveau... Merci d'avance pour votre aide. |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Première question :
"Au cours de la journée, les performances se dégradent" => Est-ce que le lendemain, les performances sont de nouveau bonnes ? => Après un redémarrage de la base ? => Après un redémarrage de l'application cliente ? Deuxième question : => La volumétrie augmente-t-elle ? => Dans quelles proportions ? => Quelle est la volumétrie actuelle ? Troisième question : => Tes statistiques sont-elles à jour ? => Quand sont-elles recalculées ? => Quand tes index sont-ils reconstruit ? => Est-ce qu'après ces opérations de maintenance, la requête est de nouveau rapide ? Je serais tenté de dire que s'il y a beaucoup de petits mouvements, tes statistiques sont vites faussées et tes index déséquilibrés. Du coup Oracle patine dans la choucroute à choisir un plan d'exécution inadapté et des index contre-performants. |
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Essaie de faire un index organisé en cluster sur l'heure des rendez-vous plutôt que sur la clé primaire, je pense que ça évitera de déséquilibrer trop vite tes index et stats (ça évite de mélanger les informations non chronologiques, dans l'ordre de leur insertion)
|
|
|
00
|
|
|
#4 | ||
![]() ![]() |
La requête en l'état sent quand même le XXième siècle.
Une bonne pratique, on ne fait jamais de select *. On récupère uniquement les colonnes dont on a besoin. Une autre bonne pratique, on alias les tables. Ce n'est pas obligatoire, mais ça permet de raccourcir le code d'une requête et d'en faciliter la relecture. Toujours pour avancer, on utilise plutôt les jointures ANSI. Ça ne change rien aux performances, mais ça laisse plus de souplesse dans les jointures externes, et ça facilite aussi la relecture d'une requête en différenciant les jointures des filtres. Enfin, le dernier filtre sur la plage, est loin d'être bien écrit ! Vous transformez des dates en texte, sur lesquels vous faites des additions et vous comparez le tout à une chaîne de caractères. En supposant que les colonnes pla_hre_debut et pla_min_debut de la table planning soient de type numériques, on devrait pouvoir réécrire quelque chose comme ça : Code :
Une dernière chose, je suis inquiet sur la modélisation de votre base, voir les id_détail dans les tables à priori mères, ça me paraît être de l'héritage un peu raté ! Pareillement sur votre table planning, vous avez trois colonnes. Une pour la date, une pour les heures et une pour minutes, alors que toutes ces informations auraient leur place dans la première.
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Quelle version d’Oracle ?
Quelle volumétrie ? Quelle sont les indexes ? Est-ce que votre requête utilise des variables de liaison (binding variables) ou des littéraux en dure comme dans votre exemple ? Est-ce que vous pouvez tracer (trace SQL) votre traitement ? Dans votre cas plusieurs phénomènes pourraient expliquer un ralentissement donc il faut plus des détails. |
|
|
00
|
|
|
#6 | |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Je suggérerai ici de
Et analysez la différence. |
|
|
|
00
|
|
|
#7 | ||
|
Membre confirmé
![]() Grégoire MARTINIngénieur développement logiciels Inscription : janvier 2011 Messages : 128 ![]() |
Bonjour,
Si il s'agit bien d'expliquer le comportement régressif d'une requête tout au long de la journée, et bien il va falloir tracer, et tracer large. En effet des traitements batch ou une montée des transactions utilisateurs, bref une sollicitation de la base croissante peut expliquer ce phénomène. Y a t il un comportement similaire avec d'autre requêtes qui a déjà été constaté ? Si tu as Statspack de dispo sur ton environnement, cela pourrait déjà etre un debut pour pouvoir analyser. http://oracle.developpez.com/guide/tuning/statpack/ http://download.oracle.com/docs/cd/B...3/statspac.htm Sinon dans un premier temps il faudrait voir l'explain plan + volumetrie des tables + index + checker les statistiques. Code :
PS : La dégradation peut etre chiffrée à quelle hauteur : x2,x3,xN ?
__________________
Cordialement. |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com