¿Qué es mejor?

06/04/2004 - 12:09 por Naimps | Informe spam
Buenas.

Qué es mejor:

IF (@x = 1)
SELECT ..
ELSE
SELECT ..

ó

IF (@x = 1)
set @SQL = 'select.'
ELSE
set @SQL = 'select.'

EXEC (@sql)

Recuerdo que álguien, en el foro, dijo que era mejor el EXEC porque así el
SQLServer no crea el plan de ejecución, o algo por el estilo.

Muchas gracias.
 

Leer las respuestas

#1 Javier Loria
06/04/2004 - 13:20 | Informe spam
Hola:
Cuando evaluas una alternativa de este tipo debes ponerla en contexto
con los objetivos de diseno, en este caso: Desempeno, Seguridad,
Matenimiento y Facilidad de Desesarrollo. Asumo que este codigo esta en un
Stored Procedure.
En Desempeno, es mas rapido el SELECT que el EXEC, la razon es que con
el EXEC no hay planes de ejecucion compilados previamente, entonces se tarda
mas. En algunas ocasiones el IF puede producir recompilaciones en cuyo caso
es mas lento pero se puede resolver haciendo SP's para cada SELECT.
Seguridad: El IF no requiere dar a los usuarios permisos sobre las
Tablas, el EXEC si. Adicionalmente es frecuente la "necesidad" de pasar
parametros a los SELECT en cuyo caso debe cuidarse uno de la inyeccion de
codigo.
Mantenimiento: Igual, siempre y cuando sea SQL 7/2000. Si deseas migrar
a otras bases de datos o incluso a nuevas versiones de SQL es posible que el
EXEC te de problemas. Adicionalmente es mas dificil/imposible depurar
EXEC's.
Facilidad de Desarrollo: Igual, si son sencillas. Cuando son mas
complejas suele ser mas facil hacerlo con EXEC.
En principio me alejaria del SQL Dinamico, es mucho mejor hacer esto
desde la aplicacion, si es necesario.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.


Naimps" <"@naimps@ <"@naimps@"@terra.es> escribio:
Buenas.

Qué es mejor:

IF (@x = 1)
SELECT ..
ELSE
SELECT ..

ó

IF (@x = 1)
set @SQL = 'select.'
ELSE
set @SQL = 'select.'

EXEC (@sql)

Recuerdo que álguien, en el foro, dijo que era mejor el EXEC porque
así el SQLServer no crea el plan de ejecución, o algo por el estilo.

Muchas gracias.

Preguntas similares