SQL 200: Codigo eficiente - Optimizacion

23/03/2008 - 12:38 por Juan Carlos Mendoza | Informe spam
Buenas:

Estoy revisando codificacion de los programadores del area de
desarrollo a fin de sugerir cambios para optimizar los queries.

Cual codificacion es mas eficiente o conveniente, dando ambas el mismo
resultado?

Ejemplo1:
insert into tabla_destino
select campo1, campo2 from tabla_origen1
union
select campo3, campo4 from tabla_origen2

Ejemplo2:
Begin Tran
insert into tabla_destino
select campo1, campo2 from tabla_origen1
insert into tabla_destino
select campo3, campo4 from tabla_origen2
Commit Tran

La consulta va orientada a que en el Ejemplo1 la data que se va a
memoria es el acumulado total de los 2 selects y en el Ejemplo2 no
ocurre asi. Desde esa perspectiva, me parece que es mas eficiente el
ejemplo 2, o estoy errado en mi apreciacion?

Veo que los programadores, arman Inserts con el producto de 6 o 7
Selects unidos por UNION, y quisiera conocer la opinion del foro al
respecto, sobre cual codificacion es mas eficiente para la ejecucion,
porque

Saludos,

Juan Carlos Mendoza

Preguntas similare

Leer las respuestas

#1 Jesús López
23/03/2008 - 13:10 | Informe spam
Lo más eficiente sería el ejemplo 1, pero usando UNION ALL en vez de UNION.
Ya que UNION requiere eliminar duplicados lo que supone un procesamiento
adicional.

Es más eficiente el ejemplo1 porque todo lo ejecuta con una única
instrucción.

La diferencia de rendimiento ente usar UNION ALL y usar varias instrucciones
insert es cada vez menos apreciable cuando el número de registros insertados
sea más grande. Estoy seguro que cuando el número de registros es de unos
cuantos cientos, la diferencia de rendimiento es totalmente inapreciable y
no merece la pena preocuparse en absoluto. Tiene sentido usar UNION ALL
cuando cada SELECT va a devolver un único registro (o sólo unos poquitos,
por ejemplo menos de diez).

Saludos:

Jesús López
www.solidq.com


"Juan Carlos Mendoza" escribió en el mensaje
news:
Mostrar la cita
#2 Rolando
23/03/2008 - 14:18 | Informe spam
Ya Jesus Lopez te explico muy bien pero yo te agrego que si probablemente
esa instruccion es de pocos registros, no hay que preocuparse mucho ya que
ni se notará diferencia. Y en el caso de que sea de muchos registros
tambien es probable que no sea muy frecuente sino que sea un proceso en
batch por lo cual tampoco es de preocuparse.
Si no es ninguno de los dos casos que digo pues chequea los planes de
ejecucion para tomar la mejor decision.


"Juan Carlos Mendoza" escribió en el mensaje
news:
Mostrar la cita
#3 Alejandro Mesa
23/03/2008 - 15:36 | Informe spam
Jesús López,

Estoy de acuerdo contigo, pero que tal si quien escribio esa sentencia esta
tratando de evitar duplicados, en ese caso UNION ALL no es de ayuda, al menos
que se use el operador NOT EXISTS en la clausula "where".


AMB

"Jesús López" wrote:

Mostrar la cita
#4 Alejandro Mesa
23/03/2008 - 15:41 | Informe spam
Juan Carlos Mendoza,

Recuerda agregar control de errores, sobre todo en el segundo ejemplo, donde
la transaccion esta conformada por dos sentencias insert. Las dos sentencias
deben proceder sin fallos o ambas ser canceladas si una de ellas falla.

Con el ejemplo 1, no tendras problemas si existe posibilidad de tener filas
repetidas entre ambas tablas. En cambio, deberas hacer ese chequeo con el
ejemplo 2.


AMB


"Juan Carlos Mendoza" wrote:

Mostrar la cita
#5 Jesús López
24/03/2008 - 15:48 | Informe spam
Mostrar la cita
Juan Carlos dice en su pregunta que el ejemplo1 y el ejemplo2 producen el
mismo resultado, así que no hay intención de evitar duplicados ...

Saludos:

Jesús López
www.soliq.com
Ads by Google
Search Busqueda sugerida