OVH Cloud OVH Cloud

Update sur 25 millions d'entrées

6 réponses
Avatar
Psa555
Bonjour,

J'ai a faire ce Update sur une table de 25 millions d'enregistrement.

UPDATE <table> SET <champ1> = SUBSTRING( champ2 , 1,3))

Note : les champs touchés ne sont pas dans des index ou dans les clés.

La problèmatique c'est le temp que ca prend pour s'éxécuter plus de 16
heures.

Ma question :
Avez vous des trucs afin de faire ce genre d'Update dans des temps plus
respectable ?

6 réponses

Avatar
Med Bouchenafa
Il faut le faire en plusieurs étapes
Par exemple,
SET ROWCOUNT 1000000
--faire 25 fois
UPDATE <table> SET <champ1> = SUBSTRING( champ2 , 1,3))
SET ROWCOUNT 0

--
Bien cordialement
Med Bouchenafa

"Psa555" a écrit dans le message de news:

Bonjour,

J'ai a faire ce Update sur une table de 25 millions d'enregistrement.

UPDATE <table> SET <champ1> = SUBSTRING( champ2 , 1,3))

Note : les champs touchés ne sont pas dans des index ou dans les clés.

La problèmatique c'est le temp que ca prend pour s'éxécuter plus de 16
heures.

Ma question :
Avez vous des trucs afin de faire ce genre d'Update dans des temps plus
respectable ?


Avatar
Gilles TOURREAU
Psa555 avait écrit le 10/05/2006 :
Bonjour,

J'ai a faire ce Update sur une table de 25 millions d'enregistrement.

UPDATE <table> SET <champ1> = SUBSTRING( champ2 , 1,3))

Note : les champs touchés ne sont pas dans des index ou dans les clés.

La problèmatique c'est le temp que ca prend pour s'éxécuter plus de 16
heures.

Ma question :
Avez vous des trucs afin de faire ce genre d'Update dans des temps plus
respectable ?



Si t'utilises une base de données H/F Classic, tes données sont sur le
serveur et que tu executes ce UPDATE sur un poste client je te
conseille vivement de le faire plustot directement sur le serveur !

En effet, si tu fais un UPDATE réseau, Windev va sans cesse faire des
aller/retour sur le réseau pour lire/modifier/ecrire les
enregistrements

3 solutions :

1/Soit, tu executes ton UPDATE sur du TSE (Ce que je fais pour des
traitements longs)

2/Soit, tu fais une appli autonome sur le serveur qui communique via
les sockets (ou ce que tu veux...) et qui execute le UPDATE...

3/Acheter un disque dur et/ou un PC plus performant...

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Gilles TOURREAU
Gilles TOURREAU a exposé le 10/05/2006 :
Psa555 avait écrit le 10/05/2006 :
Bonjour,

J'ai a faire ce Update sur une table de 25 millions d'enregistrement.

UPDATE <table> SET <champ1> = SUBSTRING( champ2 , 1,3))

Note : les champs touchés ne sont pas dans des index ou dans les clés.

La problèmatique c'est le temp que ca prend pour s'éxécuter plus de 16
heures.

Ma question : Avez vous des trucs afin de faire ce genre d'Update dans des
temps plus respectable ?



Si t'utilises une base de données H/F Classic, tes données sont sur le
serveur et que tu executes ce UPDATE sur un poste client je te conseille
vivement de le faire plustot directement sur le serveur !

En effet, si tu fais un UPDATE réseau, Windev va sans cesse faire des
aller/retour sur le réseau pour lire/modifier/ecrire les enregistrements

3 solutions :

1/Soit, tu executes ton UPDATE sur du TSE (Ce que je fais pour des
traitements longs)

2/Soit, tu fais une appli autonome sur le serveur qui communique via les
sockets (ou ce que tu veux...) et qui execute le UPDATE...

3/Acheter un disque dur et/ou un PC plus performant...

Cordialement



Mille excuses !

Je me suis planté de Forum... J'ai cru être sur le forum windev...

Encore désolé...

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
bruno reiter
Tu as peut etre intérêt à créer un index sur ta PK+ la col à modifier, puis
à faire l'update par tranche avec un where sur la PK

br

"Psa555" a écrit dans le message de news:

Bonjour,

J'ai a faire ce Update sur une table de 25 millions d'enregistrement.

UPDATE <table> SET <champ1> = SUBSTRING( champ2 , 1,3))

Note : les champs touchés ne sont pas dans des index ou dans les clés.

La problèmatique c'est le temp que ca prend pour s'éxécuter plus de 16
heures.

Ma question :
Avez vous des trucs afin de faire ce genre d'Update dans des temps plus
respectable ?


Avatar
bruno reiter
j'ai répondu vite et bête :
c'est juste : faire l'update par tranche avec un where sur la PK
surtout pour limiter le temps de lock et de rollback éventuel

br

"bruno reiter" a écrit dans le message de
news:
Tu as peut etre intérêt à créer un index sur ta PK+ la col à modifier,
puis à faire l'update par tranche avec un where sur la PK

br

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

J'ai a faire ce Update sur une table de 25 millions d'enregistrement.

UPDATE <table> SET <champ1> = SUBSTRING( champ2 , 1,3))

Note : les champs touchés ne sont pas dans des index ou dans les clés.

La problèmatique c'est le temp que ca prend pour s'éxécuter plus de 16
heures.

Ma question :
Avez vous des trucs afin de faire ce genre d'Update dans des temps plus
respectable ?






Avatar
dominique
Salut,

1. Si champ1 est un char de 3, tu peux aussi économiser le substring par

SET ANSI_WARNINGS OFF
go
UPDATE <table> SET <champ1> = champ2
go

2. Selon tes contraintes, tu peux peut-être aussi externaliser l'update
(mesurer le coût de restauration des contraintes!):

vire les contraintes
bcp out
truncate
... tu travailles sur le fichier avec awk, assimilé ou moulinette spécifique.
bcp in
restaure les contraintes

Bon courage!


"Psa555" a écrit :

Bonjour,

J'ai a faire ce Update sur une table de 25 millions d'enregistrement.

UPDATE <table> SET <champ1> = SUBSTRING( champ2 , 1,3))

Note : les champs touchés ne sont pas dans des index ou dans les clés.

La problèmatique c'est le temp que ca prend pour s'éxécuter plus de 16
heures.

Ma question :
Avez vous des trucs afin de faire ce genre d'Update dans des temps plus
respectable ?