|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre habitué
![]() Gaëtan Développeur Oracle Inscription : mai 2006 Messages : 117 ![]() |
Bonjour,
Je dois faire un insert ( 2.5M de lignes) dans une table partitionné. Dans mon insert je précise le nom de la partition. Ma question est simple, pour que mon insert soit plus rapide, peut-on désactiver les indexes context de cette partition ( et seulement cette partition), faire mon insert puis remettre l'index ? Merci D'avance |
|
|
00
|
|
|
#2 |
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 445 ![]() |
Tu as une autre solution :
Faire une une copie de ta partition sur une table temporaire de même structure (y compris les contraintes et index !) Insérer tes données dans la table temporaire. Désactiver les contraintes sur la table cible. Echanger ta partition et la table temporaire (y compris les index). Réactiver les contraintes sur la table cible.
__________________
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 | ||
|
Membre habitué
![]() Gaëtan Développeur Oracle Inscription : mai 2006 Messages : 117 ![]() |
Merci bien pour l'aide.
je viens de trouver ça Code :
Merci |
||
|
|
00
|
|
|
#4 | |||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#5 | ||||
|
Membre habitué
![]() Gaëtan Développeur Oracle Inscription : mai 2006 Messages : 117 ![]() |
Désole de réouvrir le sujet.
J'ai un petit problème quand je désactive les index et je lance mon insert Code :
Code :
|
||||
|
|
00
|
|
|
#6 |
![]() ![]() |
Quand vous dites que vous faites un insert, vous faites l'insert d'une seule ligne ?
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#7 | ||
|
Membre habitué
![]() Gaëtan Développeur Oracle Inscription : mai 2006 Messages : 117 ![]() |
Pour faire mon test oui mais le vrai insert est une simple jointure qui fait 2.5M d'insert et qui prend beaucoup de temps
Code :
|
||
|
|
00
|
|
|
#8 | |||
![]() ![]() |
Me voila rassuré, j'ai eu un doute en lisant votre exemple justement.
Avez-vous essayé de faire un insert direct load avec le hint APPEND ? Cette syntaxe permet de créer de minis-index sur les nouvelles données, ces index étant fusionnés à la fin dans les existants : http://asktom.oracle.com/pls/asktom/...32800346479086 Citation:
Au final : Code :
__________________
Email : http://scr.im/waldar |
|||
|
00
|
|
|
#9 | |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
(a) possède un trigger ou (b) une foreign key De plus, le direct path load insert directement au dessus du High water mark. Il n'utilise aucun espace libre disponible. C'est pourquoi lorsque vous avez des deletes reguliers sur votre table le direct path n'est pas recommandé. Bien à vous Mohamed Houri |
|
|
|
00
|
|
|
#10 |
|
Membre habitué
![]() Gaëtan Développeur Oracle Inscription : mai 2006 Messages : 117 ![]() |
Merci pour votre réponse mais hélas cela ne fonctionne pas
J'ai voulu faire la méthode de al1_24 mais il s'avère que j'ai 2 index global sur ma table donc au final je fais le mouv de partition mais je me retrouve a refaire quand même 2 index... Je continue ma recherche ! |
|
|
00
|
|
|
#11 | |||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
(1) Vous avez une table partitionée dans laquelle vous voulez inséré 2,5M de rows (2) vous connaissez la partition dans laquelle vont aller tous vos inserts (3) vous avez des indexes locaux partitionés et d'autres globaux (4) parmi les indexes locaux il y a peut être quelques uns qui assurent une unicité Je vous conseille de procéder ainsi (a) disabler tous les indexes locaux(sauf ceux qui assurent une unicité) mais uniquement pour la partition en question Code :
Code :
Bien cordialement Mohamed Houri |
|||||
|
|
00
|
|
|
#12 |
|
Membre habitué
![]() Gaëtan Développeur Oracle Inscription : mai 2006 Messages : 117 ![]() |
Oui c'est bien ça Mohamed, a un petit détail j'ai un index local CONTEXT
Je viens de trouver sur le net ce que vous m'indiquer Code :
ALTER session SET skip_unusable_indexes=true; En fait j'ai un problème sans en avoir un. J'ai une solution de refaire les index mais au vu du nombre de lignes dans ma table (au total plus de 2Milliard) cela va prendre un peu de temps, si je peux rester au niveau partition cela m'arrangerais |
|
|
00
|
|
|
#13 | |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Je n'ai jamais eu à faire à un index partitioné locallement du type CONTEXT. Mais puisque vous avez 2 Milliard de records auquels vous voulez ajouter 2.5 millions de records uniquement, le "overhead" des rebuild des indexes va être énorme. Je pense sincèrement qu'il n'est pas conseillé dans ce cas de faire un disable des indexes globaux (tout au moins). La seule possibilité c'est effectivement de savoir si un index local du type context peut-être localement disablé (aucune idée). Mais n'oubliez pas, puisque vous avez la partition cible, de l'utiliser dans l'insert Et dans l'insert n'oubliez pas aussi que vous avez la partie select. Avez vous penser au direct path load? Mohamed Houri |
|
|
|
00
|
|
|
#14 | ||
|
Membre habitué
![]() Gaëtan Développeur Oracle Inscription : mai 2006 Messages : 117 ![]() |
Un index context peut être disablé au niveau local mais le problème c'est ce que l'on ne peut pas faire d'insert même si on utilise
Code :
ALTER session SET skip_unusable_indexes=true; Code :
Pour le direct path load je ne connais pas très bien. J'ai utilisé le Append mais sans succes. Vous pouvez m'en dire plus sur ce sujet ( je vais allez lire de la doc aussi) Merci |
||
|
|
00
|
|
|
#15 | |||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
(a) faites vous des deletes sur votre table (b) existe t-il des triggers sur votre table (c) existe t-il des Foreign keys sur votre table Si la réponse est non aux questions précédentes alors vous pouvez utiliser quelque chose comme suit Code :
Par contre si (a) vous avez des triggers ou des FKs en place sur votre table alors le hint append va être ignoré. (b) si vous avez des deletes sur votre table l'espace gagné par le delete ne sera pas utilisé lors du direct path car celui-ci insert directement au desssu du High Water mark Pour votre information, il y a deux ans j'ai amélioré pour un client un insert sur une table partitionée via un select sur une base distance de 3 heures à moins de quelques minutes. J'ai tracé le insert/select avec le 10046 event que j'ai fait profilé avec le profiler tvd$xtat. La majeur partie de mon temps d'insert était sur un wait event appelé dbfile sequential read (sur la partie select). J'ai résolu ce problème en mettant la table correspondante ainsi que l'index en question en parrallel 4. Vous devriez tracer l'insert et voir qu'est ce qui consomme le plus de temps. Bien à vous Mohamed Houri Bien à vous Mohamed Houri |
|||||
|
|
00
|
|
|
#16 |
|
Membre habitué
![]() Gaëtan Développeur Oracle Inscription : mai 2006 Messages : 117 ![]() |
(a) non surtout pas
(b) oui mais il est désactiver avant mon insert donc non (c) oui j'ai des FK donc le Append ne va pas être pris en compte Etant données que je dois donner des résultats de temps demain Je pense que m’orienté vers 2 solutions soit l'insert en masse sans bouger les index ( long mais presque aucune action juste attendre) ou refaire carrément les indexs, mon insert sera plus rapide mais le temps de recalcule devra être pris en compte Merci de votre aide en tous cas. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com