|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre du Club
![]() Inscription : janvier 2006 Messages : 117 ![]() |
Bonjour,
Je tente de faire un DELETE massif de 82000 rows d'une table, sur un champ qui est INDEXE. J'ai effectué plusieurs fois le même test, sur la même table, avec les mêmes données, pour être certain que la différence ne venait pas d'une charge différente de la machine à plusieurs moments, mais le résultat est toujours le même : 1) Via FORMS : 13:28:33 - del_imgext(253,OUI) BEGIN 13:29:23 - 82000 valeur image deleted 13:29:24 - 1 image deleted 13:29:24 - del_imgext(253,OUI) END Donc environ 50 secondes... 2) Via PL/SQL sous Toad : Code :
14:03:48 Soit environ 40 secondes... 3) DELETE Direct en PL/SQL sous Toad : Code :
14:05:49 Soit environ 40 secondes... 4) DELETE Direct en SQL sous Toad : Code :
Donc 1 (50") > 2 (40") = 3 (40") > 4 (18") On passe presque du simple au triple entre 1 et 4 ... Si quelqu'un a une idée.... Moi je perds mon latin... Merci! |
||||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
Sans avoir le code de la fameuse procédure, il va être difficile d'expliquer précisément le pourquoi de la différence (qui sait, il y a peut être une attente volontaire de 50 secondes) ! :-)
Mais de manière générale, ce qui peut être fait en SQL doit être fait en SQL et on ne doit réserver le PL/SQL que pour des traitements particuliers... |
|
|
00
|
|
|
#3 | ||
|
Membre du Club
![]() Inscription : janvier 2006 Messages : 117 ![]() |
Leo,
Merci pour ta réponse. Voici le code de la "fameuse procédure". Code :
Merci encore. Nicolas. |
||
|
|
00
|
|
|
#4 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
Citation:
le mieux serait un tkprof dans sqlplus, en vidant le cache avant, et rollback après, afin de voir ou le temps est perdu. Il est étonnant de croire que les 2 outputs ton coûté plus de 20 secondes |
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : janvier 2006 Messages : 117 ![]() |
Bonjour Laurent,
Les deux outputs ne me servaient qu'à indiquer correctement le temps, mais même en les commentant, et en chronométrant manuellement, je tourne toujours autour de 40 secondes |
|
|
00
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
oui, mais si tu effaces 2 fois la même ligne, la deuxieme c'est plus rapide (car il n'y a plus rien a effacé) ;-)
il s'agit de déterminer si la différence est vraiment due à PL/SQL. il est normal que ça aille un peu plus vite en SQL, car il est préférable d'appeler DELETE directement. si la différence n'est pas visible dans sqlplus, mais seulement dans TOad, alors c'est pas de chance |
|
00
|
|
|
#7 | ||
|
Membre du Club
![]() Inscription : janvier 2006 Messages : 117 ![]() |
Je précise que j'effaçais bien à chaque fois 82000 lignes, car je faisais un ROLLBACK entre chaque instruction.
J'ai de plus lancé plusieurs fois le test, parfois d'abord en SQL, parfois d'abord en PL/SQL pour être certain qu'il ne s'agisse pas de problèmes de cache ou autres. Voici le résultat sous SQL+ : Code :
|
||
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
essaye de voir si tu trouves quelque indice avec tkprof
Code :
tkprof file1.trc PLSQL.tp SYS=NO tkprof file2.trc purSQL.tp SYS=NO et tu compares les fichiers générés pour voir où est la différence |
||
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
Le test de comparaison avec d'abord le delete en SQL et ensuite en PL/SQL me semble assez probant.
La proposition de Laurent est évidemment la bonne (tracer + tkprof) mais je préferais avoir les infos de wait d'où l'idée d'utiliser l'event 10046. cf http://leoanderson.developpez.com/tr...-oracle/#LII-B PS : le fait de faire ROLLBAK préserve les lignes mais ne réinitialise pas le cache ;-) |
|
|
00
|
|
|
#10 | ||
|
Membre du Club
![]() Inscription : janvier 2006 Messages : 117 ![]() |
Leo et Laurent, merci pour vos suggestions, mais n'ayant pas accès à la machine hébergeant le serveur Oracle, je vais devoir me battre avec les DBAs pour qu'ils daignent lance la commande tkprof et m'envoyer le résultat.... Je tenterai de le faire cet après-midi, car ce matin la machine est trop chargée (l'export tourne encore).
En tout cas, pour vous montrer que le problème ne vient pas du cache, j'ai lancé plusieurs fois à la suite le DELETE en SQL et en PL/SQL. Les temps de réponse sont constants (s'il s'agissait d'un problème de cache, je pense que ma première commande serait lente, puis les autres rapides) : les deux SQL prennent le même temps à peu près, et moins de temps que les deux PL/SQL, qui eux aussi prennent à peu près le même temps. Comme je l'ai dit, les temps sont en tout les cas + lents qu'hier, car l'export de la base tourne encore : Code :
DELETE PL/SQL : environ 1 minute 50s. ROLLBACK après DELETE PL/SQL : environ 1 minute 10s. DELETE SQL : environ 50s. ROLLBACK après DELETE SQL : environ 20s. D'ailleurs, si quelqu'un peut m'expliquer pourquoi le temps d'exécution des ROLLBACKS sont différents, selon que le DELETE a été fait en PL/SQL ou SQL, ça éclaircirait ma lanterne... Merci encore, Nico' |
||
|
|
00
|
|
|
#11 | ||||
|
Membre du Club
![]() Inscription : janvier 2006 Messages : 117 ![]() |
Resalut,
J'ai lancé les requêtes, d'abord le SQL puis le PL/SQL en Event 10046. Voici les résultats partiels : SQL : Code :
Code :
1) Entre SQL et PL/SQL, lors du DELETE, le chiffre indiqué pour la colonne current de Execute est multiplié par 10 !!! (le temps écoulé est multiplié par 3) 2) Entre SQL et PL/SQL, lors du ROLLBACK, le chiffre indiqué pour la colonne current de Execute est multiplié par 4 !!! (le temps écoulé est multiplié par 3). De plus il y a du "Disk" en PL/SQL alors qu'il n'y en a pas en SQL. Mais j'avoue que je ne sais pas trop comment interpréter ces résultats... Merci pour votre aide. Nicolas. P.S. : Leo, dans ton document http://leoanderson.developpez.com/traces-sessions-oracle/ , il y a une petite faute de frappe dans le chapitre II-B. Event 10046 : Il faudrait remplacer "ALTER SESSION SET EVENT '10046 trace name context off';" par "ALTER SESSION SET EVENTS '10046 trace name context off';" (EVENTS à la place de EVENT, et la coloration syntaxique bleue au lieu de noir). |
||||
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Est-ce qu'on pourrait avoir:
- la version d'Oracle - config rollback segments ou undo - la structure de la table - la taille de la table (nombre d'extents) |
|
|
00
|
|
|
#13 |
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
Je constate que dans le cas PL/SQL il y a des waits liés au ressource manager alors qu'il n'y en a pas du tout en SQL.
Code :
resmgr:waiting IN check2 412 0.26 15.52 Est-ce que les groupes de consommateurs de ressources sont utilisés ? comment ? D'accord, les temps d'attente annoncés ne compensent pas à eux seuls les écarts, mais tout de même... |
|
|
00
|
|
|
#14 | ||
|
Membre du Club
![]() Inscription : janvier 2006 Messages : 117 ![]() |
@Pifor =>
- la version d'Oracle : Oracle 9i - config rollback segments ou undo : je ne sais pas comment obtenir cette info - la structure de la table : Code :
@LeoAnderson => Oui, les tests sont réalisés avec le même compte, sur la même base, le même schéma etc... Quant aux groupes de consommateurs de ressources, j'avoue ne pas savoir ce que c'est... Merci pour votre aide. |
||
|
|
00
|
|
|
#15 | ||
|
Membre éclairé
![]() Inscription : septembre 2003 Messages : 432 ![]() |
Excusez moi, mais cela a peut être rien à voir mais nous avons eu des temps de réponse déplorable avec PL/SQL et correcte avec SQL.
cf post http://www.developpez.net/forums/vie...960&highlight= Assure toi que le typage du champ conditionné soit le même que celui de la valeur intérrogée. Code :
Dans notre cas, nous intérrogions des champs de type VARCHAR2(3) avec des constantes en char(3), je peux te dire que la différence de temps de réponse est ENORME. Dans ton exemple vu que tu es en 9i, les nombre doivent être interprété en pls_integer et non en number(12) comme le décrit ta table. Fait un test et tiens nous au courant |
||
|
|
00
|
|
|
#16 |
|
Membre du Club
![]() Inscription : janvier 2006 Messages : 117 ![]() |
Bonjour Sygale,
Merci pour ta suggestion. J'ai fait le test, mais, malheureusement, ça n'a rien changé... Je pense que bien que je DELETE 82000 Rows, je le fais en UN SEUL DELETE, et non pas en 82000, donc je pense que la conversion de PLS_INTEGER vers NUMBER(12) ne se fait qu'une seule fois, ce qui est négligeable... D'autres idées? Je suis preneur. Merci. |
|
|
00
|
|
|
#17 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Est-ce que si vous faites plusieurs exécutions consécutives:
DELETE SQL + ROLLBACK puis plusieurs exécutions consécutives: DELETE PL/SQL + ROLLBACK les temps sont-ils les mêmes avec les mêmes écarts ? Pouvez-vous aussi nous donner le nombre de lignes total de la table ainsi que le DDL de création de tous les index sur la table en question ? Est-ce que vous utilisez une option particulière de la base de données qui pourrait en particulier concerner cette table et ces index ? |
|
|
00
|
|
|
#18 | ||
|
Membre du Club
![]() Inscription : janvier 2006 Messages : 117 ![]() |
Pifor,
Si je fais plusieurs DELETE SQL + ROLLBACK PUIS plusieurs DELETE PL/SQL + ROLLBACK, les temps sont sensiblement les mêmes avec les mêmes écarts. La table contient en tout 82331 rows. Voici le script de création des index : Code :
Merci! |
||
|
|
00
|
|
|
#19 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Peut-être une piste
Je n'arrive toujours pas à comprendre pourquoi l'exécution par PL/SQL prend beaucoup plus de temps: la valeur "current" dans l'analyse de tkprof représente des accès cache qui peuvent provenir d'importantes modifications effectuées par la requête ou d'accès important au dictionnaire. Si vous avez un contrat de support Oracle, je vous conseillerais d'ouvrir un incident chez eux avec tous les éléments que vous avez donnés ici. |
|
|
00
|
|
|
#20 | |
|
Membre éclairé
![]() Inscription : septembre 2003 Messages : 432 ![]() |
Citation:
Ta question est une très bonne colle, mais je vois rien de plus de mon côté désolé |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com