OVH Cloud OVH Cloud

DELETE par bloc

16 réponses
Avatar
Alain
Bonjour,

Je tourne en rond depuis un moment sur un probléme qui ne devrait pas en
être un : supprimer des lignes dans une table. Ma table contient 60 millions
de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers un fichier
texte pour l'archivage et maintenant je souhaite effacer des lignes de la
base.

Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
transaction énorme, je lui demande de suppimer par boc de 100 000 lignes et
j'ai mis la base en mode recovery simple.

J'ai un script trés simple :

alter Database [ma_database] set recovery simple
go

SET ROWCOUNT 100000

declare @nbrow int
declare @nbcount int
declare @i int

select @nbRow =count(id)
from [ma_table]
where ma_condition
print @nbRow
set @nbcount = @nbrow / 100000
set @i=0
while @i<=@nbcount
begin
begin transaction
delete from [maTable] where
ma_condition
commit
set @i= @i+1
print @i
end
go
SET ROWCOUNT 0
go

je shrink les fichiers
et ensuite je replace ma base en mode recovery bulk copy

pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé 100000
lignes, mais les données sont toujours présentes !!!!

Je deviens fous, si quelqu'un peut m'aider...

merci d'avance

Alain

10 réponses

1 2
Avatar
Gislain
Bonjour Alain,

Je ne connais pas la raison de ton problème mais la méthode la plus rapide
pour effectuer ce genre de purge globale est de générer un script sur ta
table (description, index, clef, ...) et de le lancer.

Avantage :
. Cela aura pour effet de supprimer/recréer la table en un clin d'oeil

Inconvénient :
. Si tu as un compteur identity il est réinitialisé à 1, charge à toi de
savoir si c'est important, au besoin tu le valorises manuellement


a+

Gislain.


"Alain" a écrit dans le message de
news:%
Bonjour,

Je tourne en rond depuis un moment sur un probléme qui ne devrait pas en
être un : supprimer des lignes dans une table. Ma table contient 60


millions
de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers un fichier
texte pour l'archivage et maintenant je souhaite effacer des lignes de la
base.

Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
transaction énorme, je lui demande de suppimer par boc de 100 000 lignes


et
j'ai mis la base en mode recovery simple.

J'ai un script trés simple :

alter Database [ma_database] set recovery simple
go

SET ROWCOUNT 100000

declare @nbrow int
declare @nbcount int
declare @i int

select @nbRow =count(id)
from [ma_table]
where ma_condition
print @nbRow
set @nbcount = @nbrow / 100000
set @i=0
while @i<=@nbcount
begin
begin transaction
delete from [maTable] where
ma_condition
commit
set @i= @i+1
print @i
end
go
SET ROWCOUNT 0
go

je shrink les fichiers
et ensuite je replace ma base en mode recovery bulk copy

pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé 100000
lignes, mais les données sont toujours présentes !!!!

Je deviens fous, si quelqu'un peut m'aider...

merci d'avance

Alain




Avatar
Med Bouchenafa
Le script est tout ce qu'il y de plus correct.
N'aurait-il pas un trigger qui annulerait la transaction ?

--
Bien cordialement
Med Bouchenafa

"Alain" a écrit dans le message de news:
%
Bonjour,

Je tourne en rond depuis un moment sur un probléme qui ne devrait pas en
être un : supprimer des lignes dans une table. Ma table contient 60
millions de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers un
fichier texte pour l'archivage et maintenant je souhaite effacer des
lignes de la base.

Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
transaction énorme, je lui demande de suppimer par boc de 100 000 lignes
et j'ai mis la base en mode recovery simple.

J'ai un script trés simple :

alter Database [ma_database] set recovery simple
go

SET ROWCOUNT 100000

declare @nbrow int
declare @nbcount int
declare @i int

select @nbRow =count(id)
from [ma_table]
where ma_condition
print @nbRow
set @nbcount = @nbrow / 100000
set @i=0
while @i<=@nbcount
begin
begin transaction
delete from [maTable] where
ma_condition
commit
set @i= @i+1
print @i
end
go
SET ROWCOUNT 0
go

je shrink les fichiers
et ensuite je replace ma base en mode recovery bulk copy

pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé 100000
lignes, mais les données sont toujours présentes !!!!

Je deviens fous, si quelqu'un peut m'aider...

merci d'avance

Alain



Avatar
Alain
Ce n'est pas trop possible car j'efface des vielles données.
Et en plus j'ai mon identity dont j'ai besoin, masi je pense que ce doit
être possible de pouvoir l'initialiser à une autre valeur que 1.
C'est surtout le fait que je ne vide pas toute la table qui m'empêche de le
faire.

"Gislain" wrote in message
news:
Bonjour Alain,

Je ne connais pas la raison de ton problème mais la méthode la plus rapide
pour effectuer ce genre de purge globale est de générer un script sur ta
table (description, index, clef, ...) et de le lancer.

Avantage :
. Cela aura pour effet de supprimer/recréer la table en un clin d'oeil

Inconvénient :
. Si tu as un compteur identity il est réinitialisé à 1, charge à toi de
savoir si c'est important, au besoin tu le valorises manuellement


a+

Gislain.


"Alain" a écrit dans le message de
news:%
Bonjour,

Je tourne en rond depuis un moment sur un probléme qui ne devrait pas en
être un : supprimer des lignes dans une table. Ma table contient 60


millions
de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers un fichier
texte pour l'archivage et maintenant je souhaite effacer des lignes de la
base.

Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
transaction énorme, je lui demande de suppimer par boc de 100 000 lignes


et
j'ai mis la base en mode recovery simple.

J'ai un script trés simple :

alter Database [ma_database] set recovery simple
go

SET ROWCOUNT 100000

declare @nbrow int
declare @nbcount int
declare @i int

select @nbRow =count(id)
from [ma_table]
where ma_condition
print @nbRow
set @nbcount = @nbrow / 100000
set @i=0
while @i<=@nbcount
begin
begin transaction
delete from [maTable] where
ma_condition
commit
set @i= @i+1
print @i
end
go
SET ROWCOUNT 0
go

je shrink les fichiers
et ensuite je replace ma base en mode recovery bulk copy

pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé
100000
lignes, mais les données sont toujours présentes !!!!

Je deviens fous, si quelqu'un peut m'aider...

merci d'avance

Alain








Avatar
Alain
Non, je n'ai pas de trigger.
J'ai l'impression que le code fonctionne pour un certain nombre d'itérations
de la boucle et aprés ça ne fonctionne plus.
Je me demande s'il n'a pas un cache ou quelque chose du style qui le fait
supprimer les même lignes toutes les itérations suivantes de la boucle.
Peut-être au niveau de la transaction ? C'est la première fois que je
l'utilise il faut peut être plus parametrer la transaction ?

Merci pour vos réponses.

Alain


"Med Bouchenafa" wrote in message
news:%
Le script est tout ce qu'il y de plus correct.
N'aurait-il pas un trigger qui annulerait la transaction ?

--
Bien cordialement
Med Bouchenafa

"Alain" a écrit dans le message de news:
%
Bonjour,

Je tourne en rond depuis un moment sur un probléme qui ne devrait pas en
être un : supprimer des lignes dans une table. Ma table contient 60
millions de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers un
fichier texte pour l'archivage et maintenant je souhaite effacer des
lignes de la base.

Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
transaction énorme, je lui demande de suppimer par boc de 100 000 lignes
et j'ai mis la base en mode recovery simple.

J'ai un script trés simple :

alter Database [ma_database] set recovery simple
go

SET ROWCOUNT 100000

declare @nbrow int
declare @nbcount int
declare @i int

select @nbRow =count(id)
from [ma_table]
where ma_condition
print @nbRow
set @nbcount = @nbrow / 100000
set @i=0
while @i<=@nbcount
begin
begin transaction
delete from [maTable] where
ma_condition
commit
set @i= @i+1
print @i
end
go
SET ROWCOUNT 0
go

je shrink les fichiers
et ensuite je replace ma base en mode recovery bulk copy

pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé
100000 lignes, mais les données sont toujours présentes !!!!

Je deviens fous, si quelqu'un peut m'aider...

merci d'avance

Alain







Avatar
Patrice
La division entière peut peut-être laisser des lignes ??!!! (réfléchir en
fin de journée pfff) :

120000/100000=1, la boucle est faite une fois et il reste 20000 lignes non
détruites ???

Est- ce qu'il reste le nnombre original de lignes ou des lignes sont-elles
supprimées tout de même ???

Patrice

--

"Alain" a écrit dans le message de
news:4263dfaa$0$22175$
Non, je n'ai pas de trigger.
J'ai l'impression que le code fonctionne pour un certain nombre


d'itérations
de la boucle et aprés ça ne fonctionne plus.
Je me demande s'il n'a pas un cache ou quelque chose du style qui le fait
supprimer les même lignes toutes les itérations suivantes de la boucle.
Peut-être au niveau de la transaction ? C'est la première fois que je
l'utilise il faut peut être plus parametrer la transaction ?

Merci pour vos réponses.

Alain


"Med Bouchenafa" wrote in message
news:%
> Le script est tout ce qu'il y de plus correct.
> N'aurait-il pas un trigger qui annulerait la transaction ?
>
> --
> Bien cordialement
> Med Bouchenafa
>
> "Alain" a écrit dans le message de news:
> %
>> Bonjour,
>>
>> Je tourne en rond depuis un moment sur un probléme qui ne devrait pas


en
>> être un : supprimer des lignes dans une table. Ma table contient 60
>> millions de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers


un
>> fichier texte pour l'archivage et maintenant je souhaite effacer des
>> lignes de la base.
>>
>> Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
>> transaction énorme, je lui demande de suppimer par boc de 100 000


lignes
>> et j'ai mis la base en mode recovery simple.
>>
>> J'ai un script trés simple :
>>
>> alter Database [ma_database] set recovery simple
>> go
>>
>> SET ROWCOUNT 100000
>>
>> declare @nbrow int
>> declare @nbcount int
>> declare @i int
>>
>> select @nbRow =count(id)
>> from [ma_table]
>> where ma_condition
>> print @nbRow
>> set @nbcount = @nbrow / 100000
>> set @i=0
>> while @i<=@nbcount
>> begin
>> begin transaction
>> delete from [maTable] where
>> ma_condition
>> commit
>> set @i= @i+1
>> print @i
>> end
>> go
>> SET ROWCOUNT 0
>> go
>>
>> je shrink les fichiers
>> et ensuite je replace ma base en mode recovery bulk copy
>>
>> pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé
>> 100000 lignes, mais les données sont toujours présentes !!!!
>>
>> Je deviens fous, si quelqu'un peut m'aider...
>>
>> merci d'avance
>>
>> Alain
>>
>
>




Avatar
Philippe T [MS]
Bonjour,

Oui, pour redéfinir le champ compteur a une valeur donné, il suffira de
faire :

SET IDENTITY_INSERT MyTable ON
INSERT INTO MyTable (...) VALUES(...)
SET IDENTITY_INSERT MyTable OFF

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"Alain" wrote in message
news:4263dec9$0$22174$
Ce n'est pas trop possible car j'efface des vielles données.
Et en plus j'ai mon identity dont j'ai besoin, masi je pense que ce doit
être possible de pouvoir l'initialiser à une autre valeur que 1.
C'est surtout le fait que je ne vide pas toute la table qui m'empêche de
le faire.

"Gislain" wrote in message
news:
Bonjour Alain,

Je ne connais pas la raison de ton problème mais la méthode la plus
rapide
pour effectuer ce genre de purge globale est de générer un script sur ta
table (description, index, clef, ...) et de le lancer.

Avantage :
. Cela aura pour effet de supprimer/recréer la table en un clin d'oeil

Inconvénient :
. Si tu as un compteur identity il est réinitialisé à 1, charge à toi de
savoir si c'est important, au besoin tu le valorises manuellement


a+

Gislain.


"Alain" a écrit dans le message de
news:%
Bonjour,

Je tourne en rond depuis un moment sur un probléme qui ne devrait pas en
être un : supprimer des lignes dans une table. Ma table contient 60


millions
de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers un fichier
texte pour l'archivage et maintenant je souhaite effacer des lignes de
la
base.

Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
transaction énorme, je lui demande de suppimer par boc de 100 000 lignes


et
j'ai mis la base en mode recovery simple.

J'ai un script trés simple :

alter Database [ma_database] set recovery simple
go

SET ROWCOUNT 100000

declare @nbrow int
declare @nbcount int
declare @i int

select @nbRow =count(id)
from [ma_table]
where ma_condition
print @nbRow
set @nbcount = @nbrow / 100000
set @i=0
while @i<=@nbcount
begin
begin transaction
delete from [maTable] where
ma_condition
commit
set @i= @i+1
print @i
end
go
SET ROWCOUNT 0
go

je shrink les fichiers
et ensuite je replace ma base en mode recovery bulk copy

pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé
100000
lignes, mais les données sont toujours présentes !!!!

Je deviens fous, si quelqu'un peut m'aider...

merci d'avance

Alain












Avatar
bruno reiter [MVP]
peux-tu insérer un select count(*) pour vérifier que le nombre de lignes
diminue et un select @@trancount pour vérifier que tu as bien terminé la
transaction

br

"Alain" wrote in message
news:%
Bonjour,

Je tourne en rond depuis un moment sur un probléme qui ne devrait pas en
être un : supprimer des lignes dans une table. Ma table contient 60
millions de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers un
fichier texte pour l'archivage et maintenant je souhaite effacer des
lignes de la base.

Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
transaction énorme, je lui demande de suppimer par boc de 100 000 lignes
et j'ai mis la base en mode recovery simple.

J'ai un script trés simple :

alter Database [ma_database] set recovery simple
go

SET ROWCOUNT 100000

declare @nbrow int
declare @nbcount int
declare @i int

select @nbRow =count(id)
from [ma_table]
where ma_condition
print @nbRow
set @nbcount = @nbrow / 100000
set @i=0
while @i<=@nbcount
begin
begin transaction
delete from [maTable] where
ma_condition
commit
set @i= @i+1
print @i
end
go
SET ROWCOUNT 0
go

je shrink les fichiers
et ensuite je replace ma base en mode recovery bulk copy

pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé 100000
lignes, mais les données sont toujours présentes !!!!

Je deviens fous, si quelqu'un peut m'aider...

merci d'avance

Alain



Avatar
Steve Kass
Alain,

Se peut-il qu'aucune rangée ne satisfait "ma_condition"?
Si vous n'affichez pas le script précis, il est difficile de vous
aider. Certes que votre script ne contient pas "where ma_condition".

De toute façon, qui vous "dit à chaque fois qu'il a supprimé 100000 lignes"?
Quoiqu'aucune rangée ne satisfasse ma_condition, la condition de boucle
@i <= @nbcount sera satisfaite, et la boucle fera un tour.

Steve Kass
Drew University

Alain wrote:

Bonjour,

Je tourne en rond depuis un moment sur un probléme qui ne devrait pas en
être un : supprimer des lignes dans une table. Ma table contient 60 millions
de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers un fichier
texte pour l'archivage et maintenant je souhaite effacer des lignes de la
base.

Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
transaction énorme, je lui demande de suppimer par boc de 100 000 lignes et
j'ai mis la base en mode recovery simple.

J'ai un script trés simple :

alter Database [ma_database] set recovery simple
go

SET ROWCOUNT 100000

declare @nbrow int
declare @nbcount int
declare @i int

select @nbRow =count(id)
from [ma_table]
where ma_condition
print @nbRow
set @nbcount = @nbrow / 100000
set @i=0
while @i<=@nbcount
begin
begin transaction
delete from [maTable] where
ma_condition
commit
set @i= @i+1
print @i
end
go
SET ROWCOUNT 0
go

je shrink les fichiers
et ensuite je replace ma base en mode recovery bulk copy

pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé 100000
lignes, mais les données sont toujours présentes !!!!

Je deviens fous, si quelqu'un peut m'aider...

merci d'avance

Alain






Avatar
Med Bouchenafa
>>Certes que votre script ne contient pas "where ma_condition".




La clause WHERE n'est pas vraiment nécessaire ici.
La limite est faite par le SET ROWCOUNT 100000


--
Bien cordialement
Med Bouchenafa

"Steve Kass" a écrit dans le message de news:

Alain,

Se peut-il qu'aucune rangée ne satisfait "ma_condition"?
Si vous n'affichez pas le script précis, il est difficile de vous
aider. Certes que votre script ne contient pas "where ma_condition".

De toute façon, qui vous "dit à chaque fois qu'il a supprimé 100000
lignes"?
Quoiqu'aucune rangée ne satisfasse ma_condition, la condition de boucle
@i <= @nbcount sera satisfaite, et la boucle fera un tour.

Steve Kass
Drew University

Alain wrote:

Bonjour,

Je tourne en rond depuis un moment sur un probléme qui ne devrait pas en
être un : supprimer des lignes dans une table. Ma table contient 60
millions de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers un
fichier texte pour l'archivage et maintenant je souhaite effacer des
lignes de la base.

Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
transaction énorme, je lui demande de suppimer par boc de 100 000 lignes
et j'ai mis la base en mode recovery simple.

J'ai un script trés simple :

alter Database [ma_database] set recovery simple
go

SET ROWCOUNT 100000

declare @nbrow int
declare @nbcount int
declare @i int

select @nbRow =count(id)
from [ma_table]
where ma_condition
print @nbRow
set @nbcount = @nbrow / 100000
set @i=0
while @i<=@nbcount
begin
begin transaction
delete from [maTable] where
ma_condition
commit
set @i= @i+1
print @i
end
go
SET ROWCOUNT 0
go

je shrink les fichiers
et ensuite je replace ma base en mode recovery bulk copy

pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé 100000
lignes, mais les données sont toujours présentes !!!!

Je deviens fous, si quelqu'un peut m'aider...

merci d'avance

Alain






Avatar
Alain
Effectivement, j'ai corrigé en rajoutant + 1.

si je fais un select satitisfaisant ma condition (where jour < 040101 and
jour > 041231) j'obtiens 60 Millions d'enr, aprés execution du script il
en reste 57 millions si je setup rowcount à 1million.

Pourtant le print que je fais m'indique bien 60 itérations de ma boucle et
que 1 millions de lignes ont été supprimés à chaque fois .



"Patrice" wrote in message
news:
La division entière peut peut-être laisser des lignes ??!!! (réfléchir en
fin de journée pfff) :

120000/100000=1, la boucle est faite une fois et il reste 20000 lignes non
détruites ???

Est- ce qu'il reste le nnombre original de lignes ou des lignes sont-elles
supprimées tout de même ???

Patrice

--

"Alain" a écrit dans le message de
news:4263dfaa$0$22175$
Non, je n'ai pas de trigger.
J'ai l'impression que le code fonctionne pour un certain nombre


d'itérations
de la boucle et aprés ça ne fonctionne plus.
Je me demande s'il n'a pas un cache ou quelque chose du style qui le fait
supprimer les même lignes toutes les itérations suivantes de la boucle.
Peut-être au niveau de la transaction ? C'est la première fois que je
l'utilise il faut peut être plus parametrer la transaction ?

Merci pour vos réponses.

Alain


"Med Bouchenafa" wrote in message
news:%
> Le script est tout ce qu'il y de plus correct.
> N'aurait-il pas un trigger qui annulerait la transaction ?
>
> --
> Bien cordialement
> Med Bouchenafa
>
> "Alain" a écrit dans le message de news:
> %
>> Bonjour,
>>
>> Je tourne en rond depuis un moment sur un probléme qui ne devrait pas


en
>> être un : supprimer des lignes dans une table. Ma table contient 60
>> millions de lignes. Je souhaie faire le ménage, j'ai fait un bcp vers


un
>> fichier texte pour l'archivage et maintenant je souhaite effacer des
>> lignes de la base.
>>
>> Pour éviter de surcharger le serveur, et eviter d'avoir un fichier de
>> transaction énorme, je lui demande de suppimer par boc de 100 000


lignes
>> et j'ai mis la base en mode recovery simple.
>>
>> J'ai un script trés simple :
>>
>> alter Database [ma_database] set recovery simple
>> go
>>
>> SET ROWCOUNT 100000
>>
>> declare @nbrow int
>> declare @nbcount int
>> declare @i int
>>
>> select @nbRow =count(id)
>> from [ma_table]
>> where ma_condition
>> print @nbRow
>> set @nbcount = @nbrow / 100000
>> set @i=0
>> while @i<=@nbcount
>> begin
>> begin transaction
>> delete from [maTable] where
>> ma_condition
>> commit
>> set @i= @i+1
>> print @i
>> end
>> go
>> SET ROWCOUNT 0
>> go
>>
>> je shrink les fichiers
>> et ensuite je replace ma base en mode recovery bulk copy
>>
>> pb : il n'y pas d'erreurs, il me dit à chaque fois qu'il a supprimé
>> 100000 lignes, mais les données sont toujours présentes !!!!
>>
>> Je deviens fous, si quelqu'un peut m'aider...
>>
>> merci d'avance
>>
>> Alain
>>
>
>








1 2