|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre actif
![]() Inscription : mai 2004 Messages : 725 ![]() |
Bonjour,
J'ai éxécuté les requetes d'update sur une table document et radiologie. Sur ma base de test voici les caractéristiques : Nombre d’éléments dans la table Radiologie : 84 Nombre d’éléments dans la table Document : 1586 Nombre d’éléments dans la table SAG_DATA_TEMP : 8890 Pour faire une update de la table radiologie cela ne prend que 2 secondes. Par contre si je fais une update de la table document seulement cela fait 2 minutes et 11 secondes ! J'ai besoin d'améliorer les performances car la base de production a les caracteristiques suivantes : Nombre d’éléments dans la table Radiologie : 139119 Nombre d’éléments dans la table Document : 197145 Nombre d’éléments dans la table SAG_DATA_TEMP : 70369 J'ai déjà essayé le script suivant sur la base de prod mais sur putty l'execution dure plus longtemps que le temps de la session. La durée est trop longue. Comment améliorer mon script suivant : Je pense que la commande EXISTS pose probleme. Il ya des index sur la table Document , radiologie mais pas sur SAG_DATA_TEMP. J'essaye de faire un execution plan mais jusqu'ici je n'ai pas réussi a le faire. Voici mon script : Code :
|
||
|
|
00
|
|
|
#2 |
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 446 ![]() |
Quelle est la nécessité de passer par un curseur sur SAG_DATA_TEMP ?
Y a-t-il une partie de ton code que tu ne nous donnes pas ?
__________________
Modérateur Langage SQL N'oubliez pas le bouton et pensez aux balises [code]Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur ![]() |
|
|
00
|
|
|
#3 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Faudrait au moins le plan d'exécution pour se prononcer
Sinon, essaye IN à la place d'EXISTS. Pour moi ce serait plutôt le curseur le problème |
|
|
00
|
|
|
#4 | ||
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 446 ![]() |
Sans curseur, la mise à jour pourrait s'écrire comme cela :
Code :
__________________
Modérateur Langage SQL N'oubliez pas le bouton et pensez aux balises [code]Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur ![]() |
||
|
|
00
|
|
|
#5 | ||
|
Membre confirmé
![]() |
Hello,
Assumons que ta table SAG_DATA_TEMP est grosse. Essaie ca: L'idée est de limiter les lectures sur cette table, si elle est grosse, et de ne prendre que les valeurs distinctes des 3 colonnes que tu utilise dans tes updates. Je pense que tu dois faire un grand nombre d'updates inutiles. Code :
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
||
|
00
|
|
|
#6 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Limiter les lectures sur la table en faisant un tri dessus... quelle drole d'idée
Pour limiter les lectures faudrait limiter le nombre de lignes lues. Après, c'est sûr que si le nombre de lignes traitées par le curseur est significativement réduit, ça peut avoir du sens mais on peut tout de même espérer que cette table temporaire ne contiennent que les infos utiles et suffisantes |
|
|
00
|
|
|
#7 |
|
Membre confirmé
![]() |
C'est juste pour garantir que le tris de la relation va générer l'utilisation de l'index et un "Index fast full scan".
C'est mieux que de lire toute la table pour n'utiliser que 3 colonnes. non? Mais comme je l'ai dit, je ne connais pas la structure de la table source et j'assume dans ma proposition qu'elle est grosse. L'auteur du post pourra certainement nous renseigner... Jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
|
00
|
|
|
#8 |
|
Membre actif
![]() Inscription : mai 2004 Messages : 725 ![]() |
Merci de vos réponses.
Il y a beaucoup d'avis differents donc j'ai du mal a choisir la solution. Je vais d'abord tenter de faire un index sur SAG_DATA_TEMP sur la colonne j.s_aphp_reference_acte_rados. jkofr: Je pensais que faire un index sur plusieurs colonnes en meme temps ralentaissaient les performances d'une requete ? J'ai lu sur un article quelque part. En effet la table SAG_DATA_TEMP a beaucoup de lignes. Nombre d’éléments dans la table SAG_DATA_TEMP : 70369 al1_24 : J'ai déja essayé une solution sans curseur. J'ai d'ailleurs réalisé une requete similaire preque comme la tienne. Malheureusement cette requete dure plusieurs jours sur le cas suivant de base de données : Nombre d’éléments dans la table Radiologie : 139119 Nombre d’éléments dans la table Document : 197145 Nombre d’éléments dans la table SAG_DATA_TEMP : 70369 |
|
|
00
|
|
|
#9 | |
|
Membre confirmé
![]() |
Plusieurs jours!
Alors la table SAG_DATA_TEMP est peut-être très grosse! Avec des BLOB ou des LONG? Dans ce cas je maintien ma proposition avec un index sur les 3 colonnes de SAG_DATA_TEMP. Citation:
Voilou! Jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
|
|
00
|
|
|
#10 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
|
|
|
|
00
|
|
|
#11 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Vraiment, j'vois pas l'intérêt de l'INDEX, je ne vois pas comment la création de l'index + lecture de l'index pourrait aller plus vite que le FTS sans index
![]() L'index ne peut être intéressant qu'en supprimant le curseur me semble-t-il. Le DISTINCT en revanche peut être intéressant s'il limite le nombre d’occurrences du curseur Sinon, on a toujours pas de trace ou de plan d'exécution |
|
|
00
|
|
|
#12 | |
|
Membre confirmé
![]() |
Citation:
Pour info j'ai oublie la colonne nda qui doit aussi être dans l'index. De ce fait, la table ne sera PAS lue et SEUL l'index SERA lu. C'est bien la condition que tu cite non? Ici, seul 4 colonnes de la table SAG_DATA_TEMP sont utiles. Je ne propose pas de créer l'index juste avant le traitement. L'index est permanent. Jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
|
|
00
|
|
|
#13 |
|
Membre confirmé
![]() |
Maintenant j'ai hâte de voir le modèle de données.
jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
|
00
|
|
|
#14 | ||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Bonjour,
Il y a plusieurs points à considérer : (1) c'est un update basé sur des selects. Ce qui veut dire que le temps d'exécution n'est pas concentré uniquement dans les selects. Le temps des "updates" est également à considérer surtout que ces deux tables contiennent des indexes. Quelques questions, comme les suivantes, auraient normalement dues être posées en premier lieu: (a) Est ce que les deux tables document et radiologie ont des triggers? (b) Est ce que ces deux tables possèdent des contraintes d'intégrités? (2) vous dites que ces deux tables possèdent des indexes; combien d'indexes? quelles sonts leurs descriptions? quelle est la description de ces deux tables (3) La seule table qui n'est pas mise à jour (sag_data_temp) n'a pas d'index, pourtant elle pourrait accélerer les différents selects (4) vous commencez par un update de la table radiologie (2 sec) suivi par un update de la table document; mais cet update nécessitte un select sur la table radiologie qui vient juste d'être mise à jour. Il très probable que ce select sur la table radiologie fasse intervenir une lecture et une reconstruction de l'image à partir des rollbacks segment (read consistency) faisant d'un simple select une opération plus compliquée dans ce cas. (5) comme l'a si bien présenté al_124, pourquoi faire cet update avec du PL/SQL quand on peut le faire avec du SQL? Essayez de nous donner l'explain plan approximatif de vos updates en suivant l'exemple simple suivant: Code :
Code :
Mohamed Houri |
||||
|
|
00
|
|
|
#15 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
En effet, mais dans ce cas, on pourrait même lui conseiller de passer pas une IOT
Citation:
|
|
|
|
00
|
|
|
#16 | |
|
Membre confirmé
![]() |
Citation:
![]() Jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
|
|
00
|
|
|
#17 |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
|
|
|
00
|
|
|
#18 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
|
|
|
|
00
|
|
|
#19 |
|
Membre actif
![]() Inscription : mai 2004 Messages : 725 ![]() |
Merci,
J'ai choisi une solution similaire à celle proposé par al1_24. J'ai simplifié les requêtes en enlevant les exists et en trouvant une condition plus approprié. C'est beaucoup plus rapide sans curseur. |
|
|
00
|
|
|
#20 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com