Me podrian aclarar esto

18/01/2006 - 17:31 por VictorLeo | Informe spam
En el caso de los STORED PROCEDURES que son exclusivamente para mostrar
información se deberán evitar usar lógicas como la siguiente :


Create Proc UP_SEL_LEER
@X tinyint,
@Y char(3) as
if @X=1
Select * from tabla
Else
Select * from tabla where codigo = @Y


No es óptimo crear STORED PROCEDURES de ese tipo dado que el SQL
guarda una estadística de ejecución cada vez que se use un
procedimiento, esto quiere decir, que si la primera vez se le pasó el
parámetro @X = 1, el SQL no empleará índices para el SELECT, si se
le pasa el @X = 2 en el cual deberá leer un código en particular el
SQL tampoco usará índices debido a las estadísticas guardadas en la
ejecución anterior.

En caso sea necesario trabajar con este tipo de STORED PROCEDURES
deberán ser creados de la siguiente forma :

Create Proc UP_SEL_LEER
@X tinyint,
@Y char(3)
WITH RECOMPILE
as
if @X=1
Select * from tabla
Else
Select * from tabla where codigo = @Y

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
18/01/2006 - 18:16 | Informe spam
VictorLeo,

Crear el sp con la opcion "with recompile" es una forma de evitar que esto
suceda, pero entonces sql server recompila el sp cada vez que lo ejecutas y
no hace uso de algun plan en el cache. Prefiero crear dos sps y llamarlos asi:

create procedure usp_p1
as
Select * from tabla
go

create procedure usp_p2
@Y char(3)
as
Select * from tabla where codigo = @Y
go

Create Proc UP_SEL_LEER
@X tinyint,
@Y char(3)
as
if @X=1
exec usp_p1
Else
exec usp_p2 @Y
go
go

exec UP_SEL_LEER
exec UP_SEL_LEER
go

exec UP_SEL_LEER 1, 'aaa'
exec UP_SEL_LEER 1, 'bbb'
go

Veras que al ejecutar el sp con @x = 1, sql server reusara el plan de
ejecucion que esta en el cache para la segunda llamada @Y = 'bbb'.

Tambien existen otras formas de evitar esto. Te paso un articulo sobre el
tema.

Dynamic Search Conditions in T-SQL
http://www.sommarskog.se/dyn-search.html


AMB

"VictorLeo" wrote:

En el caso de los STORED PROCEDURES que son exclusivamente para mostrar
información se deberán evitar usar lógicas como la siguiente :


Create Proc UP_SEL_LEER
@X tinyint,
@Y char(3) as
if @X=1
Select * from tabla
Else
Select * from tabla where codigo = @Y


No es óptimo crear STORED PROCEDURES de ese tipo dado que el SQL
guarda una estadística de ejecución cada vez que se use un
procedimiento, esto quiere decir, que si la primera vez se le pasó el
parámetro @X = 1, el SQL no empleará índices para el SELECT, si se
le pasa el @X = 2 en el cual deberá leer un código en particular el
SQL tampoco usará índices debido a las estadísticas guardadas en la
ejecución anterior.

En caso sea necesario trabajar con este tipo de STORED PROCEDURES
deberán ser creados de la siguiente forma :

Create Proc UP_SEL_LEER
@X tinyint,
@Y char(3)
WITH RECOMPILE
as
if @X=1
Select * from tabla
Else
Select * from tabla where codigo = @Y


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