|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() Consultant en Business Intelligence Inscription : janvier 2007 Messages : 1 192 ![]() |
Bonjour à tous,
Voilà j'ai un gros pb avec oracle 9i Je voudrais faire un delete complet d'une table très volumineuse et commiter tous les 5000 enregistrements. Avez vous une idée de comment je pourrais faire ? Merci |
|
|
00
|
|
|
#2 |
|
Membre éprouvé
![]() Inscription : juillet 2006 Messages : 445 ![]() |
Salut,
Sol 1 : un bon vieux truncate Sol 2 : Une boucle PL A+ |
|
|
00
|
|
|
#3 |
![]() ![]() Consultant en Business Intelligence Inscription : janvier 2007 Messages : 1 192 ![]() |
Oaip le bon vieux truncate serais effectivement bienvenue,
mais le pb c'est que je dois obligatoirement avoir des logs de petites tailles car j'ai 2 bdd couplé avec dataguard et que lorsque je fait un truncate il perd les pédale et lorsque je fais un dataguard se plante car il ne peux pas traité autant d'info d'un coup. Je voulais faire une procédure PL, mais je ne sais pas par où commencer ?! |
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
CURSOR et BULK COLLECT
|
|
|
00
|
|
|
#5 | ||
![]() ![]() Consultant en Business Intelligence Inscription : janvier 2007 Messages : 1 192 ![]() |
Merci de ta réponse Fred_D
Ma question va surement te paraître idiote mais c'est quoi un bulk collect ? J'ai essayer de faire ça, mais ce n'est pas très convainquant... Code :
|
||
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
utilise la recherche pour trouver des exemples ou lis ce document : http://sheikyerbouti.developpez.com/...=Chap1#L1.2.20
|
|
|
00
|
|
|
#7 | ||
![]() ![]() Consultant en Business Intelligence Inscription : janvier 2007 Messages : 1 192 ![]() |
Je ne vois pas bien en quoi le bulk collect peux m'aider...
J'ai tester celà : Code :
En plus la clé primaire de ma table est composé ce qui m'oblige à faire la jointure sur 2 champs. Je suis perdue... J'ai vu sur internet qu'il existerais quelque chose comme ma_table.DELETE(val1, val2); qui permet de supprimer les enregistrements de la ligne val1 à la ligne val2. En savez vous plus ? |
||
|
|
00
|
|
|
#8 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 845 ![]() |
regarde à nouveau la doc que t'a donné Fred_D !
la boucle où tu fais le delete ne doit pas être un FOR... mais FORALL (sans End Loop)
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse ! Yorglaa |
|
|
00
|
|
|
#9 | ||
![]() ![]() Consultant en Business Intelligence Inscription : janvier 2007 Messages : 1 192 ![]() |
Alors voila je crois que je me suis bien battu et que j'ai finalement gagné !
J'ai laissé tomber le bulk collect pour quelque chose de plus simple : Code :
Merci à vous de votre aide. |
||
|
|
00
|
|
|
#10 | ||
|
Membre éclairé
![]() Inscription : avril 2006 Messages : 465 ![]() |
Le bulk collect pourrait t'aider si tu avais besoin de faire un select pour trouver les enregistrements à supprimer. Dans ton cas la condition est directement dans le delete. C'est donc plus simple.
Ta solution est correcte. Je te propose l'optimisation suivante qui évite de faire un count et donc potentiellement un FULL SCAN a chaque itération de boucle. Ce qui peut change beaucoup de chose du point de vue des perfs Code :
|
||
|
|
00
|
|
|
#11 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
et pourquoi pas un WHILE ROWCOUNT>0 ?
|
|
|
00
|
|
|
#12 |
![]() ![]() Consultant en Business Intelligence Inscription : janvier 2007 Messages : 1 192 ![]() |
Merci pour ces précieux conseils.
Effectivement Wurlitzer, ta solution est beaucoup moins gourmandes que la mienne. Quand à ton optimisation Fred_D, juste par curiosité qu'est ce que cela m'apporte ? La structure loop exit est-elle plus gourmande que while loop ? |
|
|
00
|
|
|
#13 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
c'est juste moins compliqué
|
|
|
00
|
|
|
#14 |
|
Membre éclairé
![]() Inscription : avril 2006 Messages : 465 ![]() |
Je vois deux raisons pour ne pas utiliser le WHILE ROWCOUNT>0 :
Sinon, je suis d'accord que c'est plus élégant |
|
|
00
|
|
|
#15 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
pour la seconde
|
|
|
00
|
|
|
#16 |
|
Membre éclairé
![]() Inscription : avril 2006 Messages : 465 ![]() |
La nuit portant conseil
et juste pour le plaisir de chipoter un peu
|
|
|
00
|
|
|
#17 |
![]() ![]() Consultant en Business Intelligence Inscription : janvier 2007 Messages : 1 192 ![]() |
Pour l'optimisation, vous êtes efficaces dans votre genre !
Wurlitzer, ta dernière solution me laisse perplexe. Parce que si je fait un while rowcount=v_pas alors justement je ne passe pas dans la boucle pour le dernier delete et donc lorsque je sort de ma boucle il me reste encore des enregistrements dans ma table, non ? Je vais rester sur la solution de Fred_D. |
|
|
00
|
|
|
#18 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
si c'est bon, l'avant dernière boucle fera un rowcount = v_pas, du coup tu passes le WHILE pour faire ce qui sera la dernière boucle
Bravo Wurlitzer
|
|
|
00
|
|
|
#19 |
![]() ![]() Consultant en Business Intelligence Inscription : janvier 2007 Messages : 1 192 ![]() |
Oh la la, honte sur moi
effectivement, vous avez raison, je n'avais pas bien saisi le but de la manoeuvre et pis c'etait le matin alors... Non, je sais que je n'ai pas d'excuse alors je m'arrete... A nouveau merci à vous et ++
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com