|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 16 ![]() |
Bonjour,
Lorsque nous supprimons quelques dizaines de milliers de lignes dans une table partitionnée - les delete concernent une seule partition, les ordres insert effectués dans cette partition après la suppression ont une performance très dégradée et finissent généralement par un problème avec le tablespace undo (impossible d'étendre le segment par 4 dans le tablespace d'annulation). Les inserts dans d'autres partitions fonctionnent correctement. Une partition contient entre 8 et 10 millions d'enregistrements. Les delete - que nous effectuons uniquement en cas d'erreur de chargement soit moins d'une fois par an heureusement - concernent de 50000 à 80000 lignes. Le problème apparait avec un delete global des 50000 ou plus lignes ou avec plusieurs delete de 10000 lignes. Le problème a été constaté sur la base de production et reproduit sur la base de développement. Nous sommes sous Oracle 9.2 Pour retrouver nos performances nous avions tout d'abord sauvegardé les données de la partition, supprimé celle-ci, recréé cette partition et réinséré les données. Dernièrement nous avons effectué un move de la partition suivi d'un rebuild des index. Pour quelle raison les performances sont-elles si dégradées après une suppression ? Peut-il y avoir une solution pour effectuer un delete qui ne dégrade pas les performances ? Est-ce que la solution d'un move de partition est la meilleure pour retrouver les performances ? |
|
|
00
|
|
|
#2 |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Combien d'indexes existent dans cette tables? Combien d'indexes partitionnés et d'indexes non partitionnés? Y-a-t-il des triggers dans cette table? Y-a-t-il des contraintes d'intégrité dans cette table? Comment se font les inserts? Par direct path ou par un insert conventionnel?
Comment sont insérées les données en 'temps normal'? Lorsque vous supprimez les données d'une partition, vous intervenez sur une seule partition de la table et sur une seule partition des indexes localement partitionnés; par contre les données contenues dans les indexes globaux peuvent être dans n'importe quelle partitions, c'est pourquoi il se peut que vos inserts souffre du temps d'insertion dans les indexes globaux dont l'efficacité se dégrade à cause de ce delete. Lorsque vous supprimez la partition et vous la recréer les indexes globaux sont recréés(rebuild) et ne ressemblent donc plus à ce qu'ils étaient étaient après le delete. La prochaine fois, tracez les inserts avec un l'event 10046 level 12 afin de voir où se situe réellement le problème |
|
|
20
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 16 ![]() |
Il existe 29 index bitmap partitionnés sur cette table.
Un rebuild de ces index sans move de la partition n'améliore pas la rapidité des inserts. J'ai aussi lancé le script d'analyse statistique utilisant dbms_stats.gather_table_stats(granularity => 'PARTITION', degree => 4, estimate_percent => 20, cascade => FALSE) sur la partition considérée sans noter d'amélioration notable dans le cas dégradé. Nous n'avons pas d'index globaux sur cette table. Nous avons une vingtaine de contrainte d'intégrité référentielle. Un trigger BEFORE INSERT OR UPDATE for each row existe sur la table. Les inserts se font par datastage via un ordre sql insert. Un test avec une boucle pl/sql lancée sous sqlplus ou toad met en évidence le même problème de dégradation de performance. Nous observons dans les fichiers traces qu'il y a beaucoup de WAIT #5: nam='db file sequential read' pour l'écriture dans la partition sur laquelle la suppression a été effectuée alors qu'il y en a très peu pour les inserts dans une autre partition par exemple pour une boucle de 99 insertions 4351 WAIT contre 9. Quelles autres informations utiles peuvent nous donner les traces ? Comment interpréter ces informations ? |
|
|
00
|
|
|
#4 | |||
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour
Citation:
Citation:
Citation:
Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|||
|
00
|
|
|
#5 | ||||||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Code :
Code :
Code :
Il va falloir identifier sur quelle index se font ces db file sequential read. Il y a deux ans j'ai résolu un problème de performance relatif à insert/select sur une table partitionnée. 60% du temps de réponse étaient sur un dbfile sequential read. La solution adoptée était la localisation de l'index incriminé (c'etait un index locallement partitionné) et de faire Code :
|
||||||||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour Mohamed,
Ou peut-être lecture d'undo ? il y a quand même eu plein de delete sur ces blocs. Et un block cleanout à faire... regal, ce serait intéressant à partir de file# et block# de trouver quel segment subit tous ces i/o (via dba_extents) Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 16 ![]() |
Ce sont surtout les bitmap index qui donnent lieu à des I/O.
J'ai créé une table de test contenant les données d'une année sans aucun index ni trigger. Il n'y a aucun problème suite à delete massif. Dès que je crée un index bitmap, je reproduit le problème. Par contre à l'exception éventuelle d'une donnée ou le bitmap n'est pas forcément le meilleur choix, l'ensemble des champs indexé ne contient que peu de valeurs différentes ce qui conduit naturellement à choisir des index bitmap. Une simple reconstruction de ces index bitmap ne permet pas de retrouver les performances. Nous allons donc prescrire à notre client d'effectuer un move de partition lors d'un delete massif (dans notre application ces delete ne sont effectués qu'en cas d'anomalie de chargement donc peu fréquents et peuvent donc donner lieu à des manipulations style move de partition) |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonne idée. bien sûr il ne faut pas supprimer les bitmap index à cause d'un cas exceptionnel.
L'explication, je pense, est liée au fait que pour insérer dans une table qui a beaucoup de trous (car il y a eu des delete) il y a des ranges de rowid à modifier dans les index bitmaps - et ce même s'ils ont été fraîchement reconstruits. Alors qu'en insérant en 'bulk' dans des nouveaux blocs, ce sont des nouveaux ranges de bitmaps qui sont rajoutés - les anciens ne sont pas touchés. donc moins de redo, moins d'undo, etc. Mais le delete devait être long non ? Plutôt qu'un delete + move il serait probablement plus rapide de faire un Create Table As Select des lignes à garder je pense.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
00
|
|
|
#9 | |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 16 ![]() |
Citation:
Merci pour les réponses. |
|
|
|
00
|
|
|
#10 |
|
Futur Membre du Club
![]() Alexis ONGAGNA Inscription : septembre 2010 Messages : 20 ![]() |
Bonjour,
Question toute bête : tu fais des delete en SQL ou en PL SQL ? Car si le UNDO pète, c'est peut être parce qu'il y a trop d'opérations à rollbacker éventuellement. Ton delete est t-il fait en utilisant un filtre sur un champ/des champs indexés ? Quelle est la taille de ton tablespace UNDO ? Est ce que tu as essayé de faire un delete en PL/SQL avec commit intermediaire tous les 100 delete ? Tu peux aussi utiliser le BULK mode pour faire des delete par paquet. Merci de répondre, nous allons investiguer. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com