|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre régulier
![]() Inscription : juin 2003 Messages : 145 ![]() |
Bonjour à tous,
je débarque sous Oracle (pas facile J'ai certainement fait une erreur grosse comme un éléphant quelque part, voici donc la structure des mes deux tables, ainsi que la requête incriminée : Temps d'exécution : entre 0.35s et 0.60s en local sur le serveur via Sql developer. Table E_Examens (27500 lignes) PrimaryKey integer (number(*,0) sur E_EXAMENS.IDEXAMEN index integer (number(*,0) sur E_EXAMENS.IDPATIENT index Asc timestamp(0) sur E_EXAMENS.DateExamen ForeignKey (Cascade) sur p_patients.idpatient Table P_Patients (20000 lignes) PrimaryKey integer (number(*,0) sur P_PATIENTS.IDPATIENT index varchar2(32 char) sur P_PATIENTS.Nom Requête : Code :
Code :
Merci bcp à tout ceux qui prendront le temps de se poser la question Souch |
||||
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
tout simplement parce que tu sélectionnes toutes les lignes des 2 tables
Si tu rajoutes une jointure qui limite le résultat, tu devrais utiliser un index |
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() Inscription : juin 2003 Messages : 145 ![]() |
Salut OraFrance,
Merci pour ta réponse, en effet ca aide de limiter le nombre de retour, cependant mes requettes gardaient des plans foireux (tout en natural, pas ou peut d'index utilisés). Je viens de trouver la solution : passer le optimizer_mode en mode 'RULE' (http://www.adp-gmbh.ch/ora/tuning/optimizer.html), je n'ai pas encore assez potassé pour piger pourquoi ca marche mieux avec, mais le résultat est équivoque : toutes mes requetes sont a présent faites en passant exclusivement par les indexs |
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
si c'est le cas ça veut dire que tes stats ne sont pas à jour. Le mode RULE est à éviter SURTOUT en 10g
|
|
|
00
|
|
|
#5 |
|
Membre régulier
![]() Inscription : juin 2003 Messages : 145 ![]() |
ha ? Pourtant c'est diablement efficace ^^
Question bête, comment mettre à jours mes stats ? cette méthode est elle la bonne ? Code :
analyze TABLE <TABLE name> compute statistics;
|
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
un beau plan d'exécution n'est pas forcément synonyme de performance. RULE est obsoléte. Quelle tête elle a ta requête maintenant ? Combien de lignes tu récupères ?
et ANALYZE aussi est obsoléte, tu dois utiliser DBMS_STATS. |
|
|
00
|
|
|
#7 | |||||
|
Membre régulier
![]() Inscription : juin 2003 Messages : 145 ![]() |
Merci pour ton aide
Citation:
la 1er requête tournait bien après avoir ajouté quelques filtres limitant le nombre de retours, et renvoyais le même temps d'exec quelque soit le mode. Code :
Code :
MODE ALL_ROWS = entre 1 et 1.5 sec la totalité des champs utilisés pour les jointures et dans la clause where sont des index (pk pour les jointures). Ce qui me chagrine, c'est que la même requete sur la même structure, indexs et données sous Firebird 1.5 ne me posent aucun problèmes et réponde bcp + vite qu'oracle moi qui croyais que migrer dessus allais tout speeder
|
|||||
|
|
00
|
|
|
#8 | ||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
essaye :
Code :
et en passant, l'application d'une fonction sur une colonne ne permet pas d'utiliser l'index. Ainsi dans la jointure : si il y a un index sur NOM, il ne sera pas utiliser. Il faut faire un index de fonction éventuellement, l'idéal étant de stocker les noms en majuscules pour éviter le UPPER |
||
|
|
00
|
|
|
#9 | |
|
Membre régulier
![]() Inscription : juin 2003 Messages : 145 ![]() |
Citation:
Effectivement, en FIRST_ROWS ca passe très bien ) en leur appliquant le bon mode ?
|
|
|
|
00
|
|
|
#10 |
|
Membre régulier
![]() Inscription : juin 2003 Messages : 145 ![]() |
PS : En stockant les noms en maj, je perd les accents ... (désolé multi post, j'ai fait citation au lieu d'edition)
|
|
|
00
|
|
|
#11 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
tu peux le modifier au niveau des paramètres de la base
FIRST_ROWS permet d'indiquer à Oracle qu'il doit s'attacher à récupérer les 1° lignes plus rapidement alors que ALL_ROWS permet à l'optimiseur de récupérer toutes les lignes avant de faire le tri et renvoyer le résultat. Au moins, là tu restes dans les précos Oracle
|
|
|
00
|
|
|
#12 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
|
|
|
|
00
|
|
|
#13 |
|
Membre régulier
![]() Inscription : juin 2003 Messages : 145 ![]() |
Oki,
je configure donc ma base pour qu'elle soit en FIRST_ROWS par défaut, et je refait le tour de mes tables pour ajouter les indexs manquants et en transformer un certain nombre en indexs de fonction :-) Merci pour ton aide précieuse ! Souch |
|
|
00
|
|
|
#14 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
attention quand même, trop d'index tue l'index
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com