Update masivo

02/12/2005 - 20:03 por Dario R. Ayala | Informe spam
Hola gente:
tengo una tabla con unos 27 millones de registros y tengo que hacer
un update muy sencillo pero que al ser tanto el volumen que esta
manejando me llena el log y cancela. El query es algo asi:

Update tabla1
set campo1 = 0
where campo2 = 0

resulta que de estos 27M de registros 26,5 tienen el campo2 en 0 y el
resto no. Esto lo resolví por ahora partiendo este insert en 10 partes
que se ejecutan desde mi aplicación de la siguiente manera:

Update tabla1
set campo1 = 0
where campo2 = 0 and right(campoId,1) = 'n' ( con n entre 0 y 9)

Esto resuelve el problema del llenado del log pero no me gusta, ya de
entrada el right no me deja aprovechar el indice en campoId, la pregunta
es: Conocen una mejor forma de hacer esto?
Gracias de antemano

Dario R. Ayala
darioaya@gmail.com
Desarrollador Microsoft DCE 2005 2 estrellas
Desarrollador Microsoft DCE 3 Estrellas

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
02/12/2005 - 20:16 | Informe spam
Dario,

La particion es buena idea, hacer el update por baches es la forma correcta
de proceder cuando tienes tantas filas que seran actualizadas. Tambien puedes
usar algo asi como:

while exists(select * from tabla1 where campo2 = 0)
update tabla1
set campo1 = 0
from (select top 10000 clave_primaria from tabla1 where campo2 = 0) as a
where tabla1.clave_primaria = a.clave_primaria
go


AMB

"Dario R. Ayala" wrote:

Hola gente:
tengo una tabla con unos 27 millones de registros y tengo que hacer
un update muy sencillo pero que al ser tanto el volumen que esta
manejando me llena el log y cancela. El query es algo asi:

Update tabla1
set campo1 = 0
where campo2 = 0

resulta que de estos 27M de registros 26,5 tienen el campo2 en 0 y el
resto no. Esto lo resolví por ahora partiendo este insert en 10 partes
que se ejecutan desde mi aplicación de la siguiente manera:

Update tabla1
set campo1 = 0
where campo2 = 0 and right(campoId,1) = 'n' ( con n entre 0 y 9)

Esto resuelve el problema del llenado del log pero no me gusta, ya de
entrada el right no me deja aprovechar el indice en campoId, la pregunta
es: Conocen una mejor forma de hacer esto?
Gracias de antemano

Dario R. Ayala

Desarrollador Microsoft DCE 2005 2 estrellas
Desarrollador Microsoft DCE 3 Estrellas

Respuesta Responder a este mensaje
#2 Dario R. Ayala
02/12/2005 - 21:37 | Informe spam
Muchas gracias Alejandro

Dario R. Ayala

Desarrollador Microsoft DCE 2005 2 estrellas
Desarrollador Microsoft DCE 3 Estrellas



Alejandro Mesa wrote:
Dario,

La particion es buena idea, hacer el update por baches es la forma correcta
de proceder cuando tienes tantas filas que seran actualizadas. Tambien puedes
usar algo asi como:

while exists(select * from tabla1 where campo2 = 0)
update tabla1
set campo1 = 0
from (select top 10000 clave_primaria from tabla1 where campo2 = 0) as a
where tabla1.clave_primaria = a.clave_primaria
go


AMB

"Dario R. Ayala" wrote:


Hola gente:
tengo una tabla con unos 27 millones de registros y tengo que hacer
un update muy sencillo pero que al ser tanto el volumen que esta
manejando me llena el log y cancela. El query es algo asi:

Update tabla1
set campo1 = 0
where campo2 = 0

resulta que de estos 27M de registros 26,5 tienen el campo2 en 0 y el
resto no. Esto lo resolví por ahora partiendo este insert en 10 partes
que se ejecutan desde mi aplicación de la siguiente manera:

Update tabla1
set campo1 = 0
where campo2 = 0 and right(campoId,1) = 'n' ( con n entre 0 y 9)

Esto resuelve el problema del llenado del log pero no me gusta, ya de
entrada el right no me deja aprovechar el indice en campoId, la pregunta
es: Conocen una mejor forma de hacer esto?
Gracias de antemano

Dario R. Ayala

Desarrollador Microsoft DCE 2005 2 estrellas
Desarrollador Microsoft DCE 3 Estrellas


Respuesta Responder a este mensaje
#3 Leandro Sgallari MCSE-MCT
03/12/2005 - 19:38 | Informe spam
Tenes en cuenta lo siguiente:
1) Tenes que poner la base de datos en modo de recuperacion simple. o
agregar al batch con el que estas trabajando una sentencia para que haga un
backup del log de transacciones, si no, se te va a llenar igual.
2) la manera mas facil y rápida de hacerlo es lo siguiente:


set rowcount 1000

while @@rowcount <> 0
begin
Update tabla1
set campo1 = 0
where campo2 = 0
end




Leandro Sgallari
MCSE-MCDBA-MCT-MCSA-MCP

NOTA. Por favor, las preguntas y comentarios en los grupos, así nos
beneficiamos todos.




"Dario R. Ayala" escribió en el mensaje
news:
Hola gente:
tengo una tabla con unos 27 millones de registros y tengo que hacer un
update muy sencillo pero que al ser tanto el volumen que esta manejando me
llena el log y cancela. El query es algo asi:

Update tabla1
set campo1 = 0
where campo2 = 0

resulta que de estos 27M de registros 26,5 tienen el campo2 en 0 y el
resto no. Esto lo resolví por ahora partiendo este insert en 10 partes que
se ejecutan desde mi aplicación de la siguiente manera:

Update tabla1
set campo1 = 0
where campo2 = 0 and right(campoId,1) = 'n' ( con n entre 0 y 9)

Esto resuelve el problema del llenado del log pero no me gusta, ya de
entrada el right no me deja aprovechar el indice en campoId, la pregunta
es: Conocen una mejor forma de hacer esto?
Gracias de antemano

Dario R. Ayala

Desarrollador Microsoft DCE 2005 2 estrellas
Desarrollador Microsoft DCE 3 Estrellas
Respuesta Responder a este mensaje
#4 Antonio Ortiz
03/12/2005 - 19:57 | Informe spam
Muy limpia tu solucion Alejandro, no deja de gustarme aunque viendola no
dejo de pensar que esta logica, no se me abria ocurrido posiblemente.

saludos,

Antonio Ortiz Ramirez
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.visualcaja.com
www.progvisual.com



"Alejandro Mesa" escribió en el
mensaje news:
Dario,

La particion es buena idea, hacer el update por baches es la forma


correcta
de proceder cuando tienes tantas filas que seran actualizadas. Tambien


puedes
usar algo asi como:

while exists(select * from tabla1 where campo2 = 0)
update tabla1
set campo1 = 0
from (select top 10000 clave_primaria from tabla1 where campo2 = 0) as


a
where tabla1.clave_primaria = a.clave_primaria
go


AMB

"Dario R. Ayala" wrote:

> Hola gente:
> tengo una tabla con unos 27 millones de registros y tengo que hacer
> un update muy sencillo pero que al ser tanto el volumen que esta
> manejando me llena el log y cancela. El query es algo asi:
>
> Update tabla1
> set campo1 = 0
> where campo2 = 0
>
> resulta que de estos 27M de registros 26,5 tienen el campo2 en 0 y el
> resto no. Esto lo resolví por ahora partiendo este insert en 10 partes
> que se ejecutan desde mi aplicación de la siguiente manera:
>
> Update tabla1
> set campo1 = 0
> where campo2 = 0 and right(campoId,1) = 'n' ( con n entre 0 y 9)
>
> Esto resuelve el problema del llenado del log pero no me gusta, ya de
> entrada el right no me deja aprovechar el indice en campoId, la pregunta
> es: Conocen una mejor forma de hacer esto?
> Gracias de antemano
>
> Dario R. Ayala
>
> Desarrollador Microsoft DCE 2005 2 estrellas
> Desarrollador Microsoft DCE 3 Estrellas
>
Respuesta Responder a este mensaje
#5 Alejandro Mesa
05/12/2005 - 15:11 | Informe spam
Leandro Sgallari MCSE-MCT,

Microsoft recomienda que se emplee la version propietaria que usa la opcion
TOP en vez de setear "rowcount". El seteo de la opcion "set rowcount" es
ignorada por sql server para tablas remotas y vistas locales y/o remotas.
Puedes leer mas sobre el tema en los libros en linea, bajo "set rowocunt".


AMB

"Leandro Sgallari MCSE-MCT" wrote:

Tenes en cuenta lo siguiente:
1) Tenes que poner la base de datos en modo de recuperacion simple. o
agregar al batch con el que estas trabajando una sentencia para que haga un
backup del log de transacciones, si no, se te va a llenar igual.
2) la manera mas facil y rápida de hacerlo es lo siguiente:


set rowcount 1000

while @@rowcount <> 0
begin
Update tabla1
set campo1 = 0
where campo2 = 0
end




Leandro Sgallari
MCSE-MCDBA-MCT-MCSA-MCP

NOTA. Por favor, las preguntas y comentarios en los grupos, así nos
beneficiamos todos.




"Dario R. Ayala" escribió en el mensaje
news:
> Hola gente:
> tengo una tabla con unos 27 millones de registros y tengo que hacer un
> update muy sencillo pero que al ser tanto el volumen que esta manejando me
> llena el log y cancela. El query es algo asi:
>
> Update tabla1
> set campo1 = 0
> where campo2 = 0
>
> resulta que de estos 27M de registros 26,5 tienen el campo2 en 0 y el
> resto no. Esto lo resolví por ahora partiendo este insert en 10 partes que
> se ejecutan desde mi aplicación de la siguiente manera:
>
> Update tabla1
> set campo1 = 0
> where campo2 = 0 and right(campoId,1) = 'n' ( con n entre 0 y 9)
>
> Esto resuelve el problema del llenado del log pero no me gusta, ya de
> entrada el right no me deja aprovechar el indice en campoId, la pregunta
> es: Conocen una mejor forma de hacer esto?
> Gracias de antemano
>
> Dario R. Ayala
>
> Desarrollador Microsoft DCE 2005 2 estrellas
> Desarrollador Microsoft DCE 3 Estrellas



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida