eliminar cursores

24/05/2005 - 21:07 por Eduardo De Luca | Informe spam
Hola como andan . Si alguno me ayuda se los voy a agradecer. Estoy en
proceso de eliminar unos cursores de unos procesos que tardaban horas ,
están quedando en minutos . Pude eliminarlos de todos lados pero me estoy
trabando en el lugar menos inesperado.

Escenario:



Tabla A

Mov_id (numérico) no autoincremental

.

..

otros campos





TablaB



Alt_id es autoincremental (manualmente) dependiendo del valor máximo
ingresado en tabla A mov_id





El tema es para un registro no hay problema ya que seria el max de mov_id
(tabla A)

Y luego para "el" sgte max (alt_id) (tablaB) +1



El problema es que tengo la solución pero no se como hacerla en TSQL .

La solución (valga la redundancia) que yo propongo es tipo cursor y es justo
lo que quiero eliminar ya que no inserto de a un registro sino en lote (mas
o menos 100000)



Alguno se le ocurre una idea?



Desde ya gracias ¡!!!!

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
24/05/2005 - 21:36 | Informe spam
Eduardo,

Esa es una de las limitaciones de usar este mecanismo (columnas cuyo valor
se incrementa basado en el valor de una columna en otra tabla), es util
cuando insertas filas de una en una, pero terminas procesando un lote fila a
fila cuando debes insertar mas de una fila a la vez.


AMB

"Eduardo De Luca" wrote:

Hola como andan . Si alguno me ayuda se los voy a agradecer. Estoy en
proceso de eliminar unos cursores de unos procesos que tardaban horas ,
están quedando en minutos . Pude eliminarlos de todos lados pero me estoy
trabando en el lugar menos inesperado.

Escenario:



Tabla A

Mov_id (numérico) no autoincremental

..

...

otros campos





TablaB



Alt_id es autoincremental (manualmente) dependiendo del valor máximo
ingresado en tabla A mov_id





El tema es para un registro no hay problema ya que seria el max de mov_id
(tabla A)

Y luego para "el" sgte max (alt_id) (tablaB) +1



El problema es que tengo la solución pero no se como hacerla en TSQL .

La solución (valga la redundancia) que yo propongo es tipo cursor y es justo
lo que quiero eliminar ya que no inserto de a un registro sino en lote (mas
o menos 100000)



Alguno se le ocurre una idea?



Desde ya gracias ¡!!!!



Respuesta Responder a este mensaje
#2 Eduardo De Luca
24/05/2005 - 21:56 | Informe spam
Si Gracias Alejandro , por tu acotacion pero presisamente como podes
apreciar que destaco que esta es una tecnica tipica de programar con
cursores y es justo lo que estoy eliminando de un proceso
"Alejandro Mesa" escribió en el
mensaje news:
Eduardo,

Esa es una de las limitaciones de usar este mecanismo (columnas cuyo valor
se incrementa basado en el valor de una columna en otra tabla), es util
cuando insertas filas de una en una, pero terminas procesando un lote fila
a
fila cuando debes insertar mas de una fila a la vez.


AMB

"Eduardo De Luca" wrote:

Hola como andan . Si alguno me ayuda se los voy a agradecer. Estoy en
proceso de eliminar unos cursores de unos procesos que tardaban horas ,
están quedando en minutos . Pude eliminarlos de todos lados pero me estoy
trabando en el lugar menos inesperado.

Escenario:



Tabla A

Mov_id (numérico) no autoincremental

..

...

otros campos





TablaB



Alt_id es autoincremental (manualmente) dependiendo del valor máximo
ingresado en tabla A mov_id





El tema es para un registro no hay problema ya que seria el max de mov_id
(tabla A)

Y luego para "el" sgte max (alt_id) (tablaB) +1



El problema es que tengo la solución pero no se como hacerla en TSQL .

La solución (valga la redundancia) que yo propongo es tipo cursor y es
justo
lo que quiero eliminar ya que no inserto de a un registro sino en lote
(mas
o menos 100000)



Alguno se le ocurre una idea?



Desde ya gracias ¡!!!!



Respuesta Responder a este mensaje
#3 Don Roque
24/05/2005 - 22:13 | Informe spam
Eduardo,

La solucion que se me ocurre para tu problema es la siguiente:

1) crea una tabla temporal, que tenga un campo IDENTITY (1, 1) como ID,
el resto de los campos deberian ser los mismos campos que luego vas a
terminar insertando.

2) inserta todos los datos primero en la tabla temporal

3) obtene ese valor maximo que tenes en una variable

4) hace el insert en tu tabla de la siguiente manera

insert into LaTabla (id, campo1, campo2, campo3)
select id+@maximoid, campo1, campo2, campo3
from #la_tabla_temporal

asegurate que la TEMPDB tenga el espacio suficiente... y listo
Respuesta Responder a este mensaje
#4 Alejandro Mesa
24/05/2005 - 22:14 | Informe spam
Eduardo,

A veces las decisiones tomadas durante la implementacion fisica del modelo
logico, conlleva a que se tenga que prescindir de ciertas ventajas, como por
ejemplo el hecho de poder insertar en masa cuando usamos una columna con
propiedad identity. Si por ejemplo, el sistema esta diseñado para insertar
filas de forma unitaria, pues la decision es muy correcta, pero si en cambio
debes permitir insertar en masa pero decidistes que en vez de usar una
columna identity, usaras una columna que su valor vendra del incremento
manual de una columna en otra tabla, entonces fue una mala decision y la
forma de balancear esa decision es haciendo un procesamiento fila por fila
para estos casos.

Si lograstes bajar el tiempo de duracion del proceso, de horas a minutos,
entonces es un logro. No porque no puedas eliminar todos los cursores, vas ha
dejar de reconocer el mejoramiento hecho.

En sql server 2000, una funcion definida por el usuario no puede modificar
el estado de la base de datos, por lo que no podemos tomar ventaja de las
udfs. Quizas sql server traiga algun mejoramiento en esa area con la nueva
version.


AMB

"Eduardo De Luca" wrote:

Si Gracias Alejandro , por tu acotacion pero presisamente como podes
apreciar que destaco que esta es una tecnica tipica de programar con
cursores y es justo lo que estoy eliminando de un proceso
"Alejandro Mesa" escribió en el
mensaje news:
> Eduardo,
>
> Esa es una de las limitaciones de usar este mecanismo (columnas cuyo valor
> se incrementa basado en el valor de una columna en otra tabla), es util
> cuando insertas filas de una en una, pero terminas procesando un lote fila
> a
> fila cuando debes insertar mas de una fila a la vez.
>
>
> AMB
>
> "Eduardo De Luca" wrote:
>
>> Hola como andan . Si alguno me ayuda se los voy a agradecer. Estoy en
>> proceso de eliminar unos cursores de unos procesos que tardaban horas ,
>> están quedando en minutos . Pude eliminarlos de todos lados pero me estoy
>> trabando en el lugar menos inesperado.
>>
>> Escenario:
>>
>>
>>
>> Tabla A
>>
>> Mov_id (numérico) no autoincremental
>>
>> ..
>>
>> ...
>>
>> otros campos
>>
>>
>>
>>
>>
>> TablaB
>>
>>
>>
>> Alt_id es autoincremental (manualmente) dependiendo del valor máximo
>> ingresado en tabla A mov_id
>>
>>
>>
>>
>>
>> El tema es para un registro no hay problema ya que seria el max de mov_id
>> (tabla A)
>>
>> Y luego para "el" sgte max (alt_id) (tablaB) +1
>>
>>
>>
>> El problema es que tengo la solución pero no se como hacerla en TSQL .
>>
>> La solución (valga la redundancia) que yo propongo es tipo cursor y es
>> justo
>> lo que quiero eliminar ya que no inserto de a un registro sino en lote
>> (mas
>> o menos 100000)
>>
>>
>>
>> Alguno se le ocurre una idea?
>>
>>
>>
>> Desde ya gracias ¡!!!!
>>
>>
>>



Respuesta Responder a este mensaje
#5 Eduardo De Luca
24/05/2005 - 22:46 | Informe spam
Tenes razon GRacias

Quedaria asi

tabla temp

columna con el valormaximo ident. columna cal
10 1 10+1 
10 2 10+2
etc

luego inserto masivamente.

Es una solucion media "oscura" pero siempre va a andar mas rapido que el
cursor
Gracias nuevamente .
Tambien a Alejandro
Saludos

"Don Roque" escribió en el mensaje
news:
Eduardo,

La solucion que se me ocurre para tu problema es la siguiente:

1) crea una tabla temporal, que tenga un campo IDENTITY (1, 1) como ID,
el resto de los campos deberian ser los mismos campos que luego vas a
terminar insertando.

2) inserta todos los datos primero en la tabla temporal

3) obtene ese valor maximo que tenes en una variable

4) hace el insert en tu tabla de la siguiente manera

insert into LaTabla (id, campo1, campo2, campo3)
select id+@maximoid, campo1, campo2, campo3
from #la_tabla_temporal

asegurate que la TEMPDB tenga el espacio suficiente... y listo

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida