¿No es mejor INSERTS en grupo que una a una?

20/02/2007 - 12:18 por Victor | Informe spam
Hola.

he cambiado un SP el cuál, dentro de un WHILE realizaba, en 8 tablas, 1
INSERT en cada una de ellas. El While tiene entre 2 y 4 "ciclos".

Más o menos es así:

insert into ic_billetes
select . from ic_billetes where bil_id = @bil

SELECT @bil_id = (SELECT SCOPE_IDENTITY())

insert into ic_bilper
select . from ic_bilper where bip_bil_id = @bil

y así hasta 8 tablas unas 2 o cuatro veces.

"Brillante" ida mia: me creo unas variables del tipo table, dentro del WHILE
realizao los INSERTS en las tablas temporales y así luego realizo de golpe
los INSERTS. De esta forma los SELECTS de los INSERTS en las tablas buenas
son un poco más complicadas, pero no son mucho más pesadas (lo he mirado con
el plan de ejecución).

El problema que tengo es que tarda más la nueva forma que la anterior (si
eran 4'' ahora son 8'' o 9'').

¿No es, en principio, una buena idea? ¿O no?

Sé que depende los índices y de los SELECTS, pero en principio es mejor
realizar las operaciones en grupo que indidual, ¿no?

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Alfredo Novoa
20/02/2007 - 12:25 | Informe spam
On Tue, 20 Feb 2007 12:18:52 +0100, "Victor" wrote:


Sé que depende los índices y de los SELECTS, pero en principio es mejor
realizar las operaciones en grupo que indidual, ¿no?



Por supuesto, mucho mejor.
Respuesta Responder a este mensaje
#2 Maxi
20/02/2007 - 13:06 | Informe spam
Hola Victor, todo depende, cada metodo tiene un pro y contra, si haces uno
por uno el rendimiento seguro sera mas lento pero tambien si haces todo de
una y falla una fila fallara todo, asi que deberias definir primero como
queres la logica


Salu2

Microsoft MVP SQL Server
Culminis Speaker

"Victor" escribió en el mensaje
news:eWZO%
Hola.

he cambiado un SP el cuál, dentro de un WHILE realizaba, en 8 tablas, 1
INSERT en cada una de ellas. El While tiene entre 2 y 4 "ciclos".

Más o menos es así:

insert into ic_billetes
select . from ic_billetes where bil_id = @bil

SELECT @bil_id = (SELECT SCOPE_IDENTITY())

insert into ic_bilper
select . from ic_bilper where bip_bil_id = @bil

y así hasta 8 tablas unas 2 o cuatro veces.

"Brillante" ida mia: me creo unas variables del tipo table, dentro del
WHILE
realizao los INSERTS en las tablas temporales y así luego realizo de
golpe
los INSERTS. De esta forma los SELECTS de los INSERTS en las tablas buenas
son un poco más complicadas, pero no son mucho más pesadas (lo he mirado
con
el plan de ejecución).

El problema que tengo es que tarda más la nueva forma que la anterior (si
eran 4'' ahora son 8'' o 9'').

¿No es, en principio, una buena idea? ¿O no?

Sé que depende los índices y de los SELECTS, pero en principio es mejor
realizar las operaciones en grupo que indidual, ¿no?

Muchas gracias.


Respuesta Responder a este mensaje
#3 Alfredo Novoa
20/02/2007 - 13:36 | Informe spam
On Tue, 20 Feb 2007 09:06:53 -0300, "Maxi"
wrote:

pero tambien si haces todo de
una y falla una fila fallara todo



Y eso es bueno.

Saludos
Respuesta Responder a este mensaje
#4 Maxi
20/02/2007 - 13:51 | Informe spam
Y depende lo q busques, si vos queres que si una fila falle no se guarde
todo el lote entonces los conjuntos son mejores, ahora si vos queres
insertar y si fallan detectarlos pero que no se corte todo entonces vas a
tener que hacerlo fila a fila


Salu2

Microsoft MVP SQL Server
Culminis Speaker

"Alfredo Novoa" escribió en el mensaje
news:
On Tue, 20 Feb 2007 09:06:53 -0300, "Maxi"
wrote:

pero tambien si haces todo de
una y falla una fila fallara todo



Y eso es bueno.

Saludos



Respuesta Responder a este mensaje
#5 Jose Mariano Alvarez
20/02/2007 - 14:36 | Informe spam
Bueno, creo que se va a armar otra vez una discusion interesante.

Si el ciclo es pequeño como dices (< 4), es casi seguro que no haya
diferencia o que funcione mejor de 1 a 1.
Fijate que cuando los registros son pocos el planificador del sql server usa
internamente para resolver los join nested loops (ciclos anidados) en lugar
de hash join o merge join. esto es porque no precisa condiciones
adicionales, preparaciones complejas, etc que aumentan los tiempos.
Obviamente tienes un caso de estos.

Lo mismo ocurre cuando comparas los ordenes de los algoritmos de SORT
(merge,quick,bubble,etc). Verificas que es mcucho mas costoso un quicksort
que un bubblesort para pocos elementos.

Conclusion:
Si la cantidad de veces que se ejecuta un ciclo es pequeña no vale la pena
tratar de eliminar los ciclos. Es mas podrias usar un cursor tranquilamente
siempre que sea el cursor adecuado.




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"Victor" wrote in message
news:eWZO%
Hola.

he cambiado un SP el cuál, dentro de un WHILE realizaba, en 8 tablas, 1
INSERT en cada una de ellas. El While tiene entre 2 y 4 "ciclos".

Más o menos es así:

insert into ic_billetes
select . from ic_billetes where bil_id = @bil

SELECT @bil_id = (SELECT SCOPE_IDENTITY())

insert into ic_bilper
select . from ic_bilper where bip_bil_id = @bil

y así hasta 8 tablas unas 2 o cuatro veces.

"Brillante" ida mia: me creo unas variables del tipo table, dentro del
WHILE
realizao los INSERTS en las tablas temporales y así luego realizo de
golpe
los INSERTS. De esta forma los SELECTS de los INSERTS en las tablas buenas
son un poco más complicadas, pero no son mucho más pesadas (lo he mirado
con
el plan de ejecución).

El problema que tengo es que tarda más la nueva forma que la anterior (si
eran 4'' ahora son 8'' o 9'').

¿No es, en principio, una buena idea? ¿O no?

Sé que depende los índices y de los SELECTS, pero en principio es mejor
realizar las operaciones en grupo que indidual, ¿no?

Muchas gracias.


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