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

6 réponses

1 2
Avatar
Alain
Cette nuit j'ai lancé ma procédure directement sur l'analyseur de requete du
serveur sql en me connectant via remote service et là miracle les lignes
sont supprimés correctement...

Je vais essayer de mettre les traces indiqués pour voir ce qui cloche sur
mon poste client ...

Merci à tous pour votre aide.

"bruno reiter [MVP]" <remove.this! wrote in message
news:%
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
Alain
Ma condition est seulement une selection de date :
where jour < 041231 and jour > 040101

J'ai verifié cette requete en lancant un select count(id) sur cette
condition et j'en obtenais bien 60 millions.

Quand je disais que l'analyseur me disait : " chaque fois qu'il a supprimé
100000 lignes"
Je parlais du print de l'analyseur qui m'indique que 100000 lignes ont ete
affectés par ma requête, et cela pour chaque itération de ma boucle.

En executant le script directement sur le serveur, il a correctement
fonctionné. Il y a donc un truc qui clochait sur mon poste client...

Merci en tous cas pour votre aide.


"Steve Kass" wrote in message
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
J'ai indiqué la condition pour être sûr qu'il supprime les bonnes lignes
dans ma table.

Le script a correctement fonctionné en le lancant directement sur le
serveur, le probléme devait donc provenir de mon poste client et de mon
réseau...
Je vais chercher d'où provenait l'erreur et si je trouve je posterai mes
résulats.

Merci pour votre aide.

Alain

"Med Bouchenafa" wrote in message
news:%23yD%
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
Merci, je note.

Alain

"Philippe T [MS]" wrote in message
news:%
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
Alain
petite erreur dans le post précédant il fallait lire
(where jour > 040101 and jour < 041231) évidemment.

Désolé.

Alain

"Alain" wrote in message
news:
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
>>
>
>












Avatar
Fred BROUARD
Si
where jour < 041231 and jour > 040101
est bien votre condition, et que jour est de type DATETIME alors c'est normal
que cela fonctionne aléatoirement.
En effet une dateTime est un type DATETIME et non un entier. Quelle conversion
d'entier efectue t-il pour parvenir à une date ? Mystère. Votre condition aurait
due être écrite :

where jour <= CAST('20041231' AD DATETIME)
and jour >= CAST('20040101' AS DATETIME)

A +

Alain a écrit:
Ma condition est seulement une selection de date :
where jour < 041231 and jour > 040101

J'ai verifié cette requete en lancant un select count(id) sur cette
condition et j'en obtenais bien 60 millions.

Quand je disais que l'analyseur me disait : " chaque fois qu'il a supprimé
100000 lignes"
Je parlais du print de l'analyseur qui m'indique que 100000 lignes ont ete
affectés par ma requête, et cela pour chaque itération de ma boucle.

En executant le script directement sur le serveur, il a correctement
fonctionné. Il y a donc un truc qui clochait sur mon poste client...

Merci en tous cas pour votre aide.


"Steve Kass" wrote in message
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












--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
1 2