OVH Cloud OVH Cloud

delete sur Grosse table

18 réponses
Avatar
Ch.
Bonjour,

j'ai une table de 80 millions d'enregistrements
j'ai fais divers traitements dans des tables temporaires pour aller vite et
eviter de locker cette table.

la fin du process doit éliminer 1 million de lignes dans ces 80 Millions
seulement

autant le select va vite

select *
from XXX as X
inner join ZZZ as Z
on z.id = x.id


autan le delete est horriblement long, qu'est ce que j'ai raté ?
delete from Z
from XXX as X
inner join ZZZ as Z
on z.id = x.id

8 réponses

1 2
Avatar
EmanuelL
Corrigée:

DELETE ZZZ
FROM ZZZ AS Z
INNER JOIN XXX AS X
ON Z.Id = X.Id

--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Avatar
Ch.
je comprends mais la c'est simpelment l'analyse de la requete et pas le
traitement que devrait ralentir et on parle de microseconde.
enfin je suppose !


"EmanuelL" a écrit dans le message de
news:
Bonjour Ch,

Il me semble que DELETE n'aime pas trop l'alias devant FROM (DELETE FROM
MonAlias), c'est de préciser le nom de la table.

Juste une sugestion :
DELETE ZZZ
FROM ZZZ AS Z
INNER JOIN XXX AS X
IN Z.Id = X.Id

PS: Pas de FROM devant ZZZ pour ce cas particulier.

A+ ;-)

Ch. a émis l'idée suivante :
Bonjour,

j'ai une table de 80 millions d'enregistrements
j'ai fais divers traitements dans des tables temporaires pour aller vite
et eviter de locker cette table.

la fin du process doit éliminer 1 million de lignes dans ces 80 Millions
seulement

autant le select va vite

select *
from XXX as X
inner join ZZZ as Z
on z.id = x.id


autan le delete est horriblement long, qu'est ce que j'ai raté ?
delete from Z
from XXX as X
inner join ZZZ as Z
on z.id = x.id



--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org




Avatar
OlivierH
salut manu !


EmanuelL a écrit :
Corrigée:

DELETE ZZZ
FROM ZZZ AS Z
INNER JOIN XXX AS X
ON Z.Id = X.Id



Avatar
EmanuelL
Salut Olivier, je m'en doutais que c'était toi.
C'est bien qu'on se recontre ici aussi. ;-)

OlivierH avait soumis l'idée :
salut manu !


EmanuelL a écrit :
Corrigée:

DELETE ZZZ
FROM ZZZ AS Z
INNER JOIN XXX AS X
ON Z.Id = X.Id





--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Avatar
OlivierH
J'ai commencé à migrer mon appli sur sqlserver,
j'ai vu que tu posais plein de questions sur ce forum,
alors je me suis jeté à l'eau.

A très bientôt,
Olivier,

EmanuelL a écrit :
Salut Olivier, je m'en doutais que c'était toi.
C'est bien qu'on se recontre ici aussi. ;-)

OlivierH avait soumis l'idée :
salut manu !


EmanuelL a écrit :
Corrigée:

DELETE ZZZ
FROM ZZZ AS Z
INNER JOIN XXX AS X
ON Z.Id = X.Id







Avatar
bruno reiter
peut être faut il supprimer les index non clustered avant, les remettre
après (passer en bulk log) s'il y en a beaucoup.
désactiver des triggers si possible
supprimer par morceau
partitionner la table si edition enterprise
et ... utiliser un environnement de test pour ne pas avoir à attendre un
mois et la prod ;-)

BR

"Ch." wrote in message
news:
Bonjour,

j'ai une table de 80 millions d'enregistrements
j'ai fais divers traitements dans des tables temporaires pour aller vite
et eviter de locker cette table.

la fin du process doit éliminer 1 million de lignes dans ces 80 Millions
seulement

autant le select va vite

select *
from XXX as X
inner join ZZZ as Z
on z.id = x.id


autan le delete est horriblement long, qu'est ce que j'ai raté ?
delete from Z
from XXX as X
inner join ZZZ as Z
on z.id = x.id






Avatar
Patrice
Il y a sans doute aussi la gestion de la transaction plus la mise à jour des
index ce que le select n'a pas à gérer... Je regarderais ce que cela donne
comme activité disque comparé avec le select...

--
Patrice


"Ch." a écrit dans le message de news:

Bonjour,

j'ai une table de 80 millions d'enregistrements
j'ai fais divers traitements dans des tables temporaires pour aller vite
et eviter de locker cette table.

la fin du process doit éliminer 1 million de lignes dans ces 80 Millions
seulement

autant le select va vite

select *
from XXX as X
inner join ZZZ as Z
on z.id = x.id


autan le delete est horriblement long, qu'est ce que j'ai raté ?
delete from Z
from XXX as X
inner join ZZZ as Z
on z.id = x.id






Avatar
Ch.
bon mon dernier test ou j'ai reduit
le delete à une simple jointure sur un ID PK va bien plus vite.

je pense qu'on peut faire mieux
en gros ca donne 1h30 pour virer 1 million de ligne sur une table qui en
contient 80 millions.

pour le moment en terme de process global c'est largement acceptable
mais j'aimerais améliorer ça pour comprendre et pas reproduire le soucis
ailleurs.
c'est pas la premiere fois que je remarque un fort ralentissement au niveau
d'un delete.

me reste à essayer de desactiver tout les index, le probleme de cette
solution
c'est que la reactivation reconstruit l'index et du coup c'est 2h, donc pas
un bon plan vu que je vais perdre ce que je risque de gagner.

l'autre solution c'etait de refaire un select into des 80million moins le
million
mais du coup il va falloir refaire les index et je revient sur le cas du
dessus.


donc la vraie solution c'est de reduire le temps du delete.
mais bon j'suis peut etre proche de la limite...



"Patrice" <http://www..chez.com/scribe/> a écrit dans le message de
news:4a964dfb$0$23440$
Il y a sans doute aussi la gestion de la transaction plus la mise à jour
des index ce que le select n'a pas à gérer... Je regarderais ce que cela
donne comme activité disque comparé avec le select...

--
Patrice


"Ch." a écrit dans le message de news:

Bonjour,

j'ai une table de 80 millions d'enregistrements
j'ai fais divers traitements dans des tables temporaires pour aller vite
et eviter de locker cette table.

la fin du process doit éliminer 1 million de lignes dans ces 80 Millions
seulement

autant le select va vite

select *
from XXX as X
inner join ZZZ as Z
on z.id = x.id


autan le delete est horriblement long, qu'est ce que j'ai raté ?
delete from Z
from XXX as X
inner join ZZZ as Z
on z.id = x.id










1 2