Recompilar vistas y sps...

26/11/2005 - 21:20 por Sans | Informe spam
Recientemente tuve un problema con una aplicacion, la cual se quedaba
congelada al ejecutar un sp que hace referencia a una vista...
La solucion que le di fue re-crear la vista y a partir de ahi todo
bien...
He leido que en ocasiones hay que re-crear o recompilar vistas y
spses esto cierto???
Si es asi, que opciones tengo para hacerlo de manera automatica???

Saludos

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
28/11/2005 - 15:35 | Informe spam
Sans,

Cuando alteras una tabla que es referenciada desde una vista, sql server no
actualiza la metadata de esa vista, tienes que refrescarla usando el
procedimiento sp_refreshview. En cuanto a los procedimientos almacenados,
estos deben ser recompilados si estos tienen parametros de entrada que seran
usados en la clausula "where" de alguna sentencia "select" y los valores
pasados no son tipicos ó el plan de ejecucion en el cache esta basado en
valores no tipicos y se pasan valores tipicos (esto se conoce como "parameter
sniffing") lo cual provoca que sql server use un plan de ejecucion no
adecuado y para lo cual se recomiendo que se recompile el sp, lo cual se
puede hacer usando sp_recompile, o la opcion "with recompile" cuando lo creas
o cuando lo ejecutas. Tambien puedes usar sp_executesql para que la sentencia
"select" se ejecute en un contexto diferente y por lo cual sql server creara
un nuevo plan de ejecucion.

Aca te paso un script de como hacer para refrezcar las vistas, puedes usar
el mismo esquema para recompilar los sps, solo que debes usar la vista
INFORMATION_SCHEMA.ROUTINES y el sp sp_recompile.

use northwind
go

declare @sql nvarchar(4000)
declare @ts sysname
declare @tn sysname
declare views_cursor cursor
local
fast_forward
for
select
TABLE_SCHEMA,
TABLE_NAME
from
INFORMATION_SCHEMA.TABLES
where
TABLE_TYPE = 'VIEW'
and objectproperty(object_id(quotename(TABLE_SCHEMA) + '.' +
quotename(TABLE_NAME)), 'IsMSShipped') = 0

open views_cursor

while 1 = 1
begin
fetch next from views_cursor into @ts, @tn

if @@error != 0 or @@fetch_status != 0 break

set @sql = N'exec sp_refreshview ''' + quotename(@ts) + '.' +
quotename(@tn) + N''''

print @sql
exec sp_executesql @sql
end

close views_cursor
deallocate views_cursor
go

Tambien te paso un link para que leas sobre el tema de "parameter sniffing"
y por que esto influye en la ejecucion de un sp.

A technique for ensuring plan stability in SQL Server 2000
http://blogs.msdn.com/khen1234/arch...24228.aspx


AMB

"Sans" wrote:

Recientemente tuve un problema con una aplicacion, la cual se quedaba
congelada al ejecutar un sp que hace referencia a una vista...
La solucion que le di fue re-crear la vista y a partir de ahi todo
bien...
He leido que en ocasiones hay que re-crear o recompilar vistas y
spses esto cierto???
Si es asi, que opciones tengo para hacerlo de manera automatica???

Saludos


Respuesta Responder a este mensaje
#2 Alejandro Mesa
28/11/2005 - 15:51 | Informe spam
Sans,

Me falto decir que es suficiente con postear una pregunta o problema una
sola vez. Postearla multiples veces, no solo hace mas dificil seguir el hilo,
sino que haces que otros miembros mal gasten su tiempo contestando preguntas
ya contestadas por otros miembros. No pienses solo en ti, recuerda que somos
un grupo.


Alejandro Mesa

"Alejandro Mesa" wrote:

Sans,

Cuando alteras una tabla que es referenciada desde una vista, sql server no
actualiza la metadata de esa vista, tienes que refrescarla usando el
procedimiento sp_refreshview. En cuanto a los procedimientos almacenados,
estos deben ser recompilados si estos tienen parametros de entrada que seran
usados en la clausula "where" de alguna sentencia "select" y los valores
pasados no son tipicos ó el plan de ejecucion en el cache esta basado en
valores no tipicos y se pasan valores tipicos (esto se conoce como "parameter
sniffing") lo cual provoca que sql server use un plan de ejecucion no
adecuado y para lo cual se recomiendo que se recompile el sp, lo cual se
puede hacer usando sp_recompile, o la opcion "with recompile" cuando lo creas
o cuando lo ejecutas. Tambien puedes usar sp_executesql para que la sentencia
"select" se ejecute en un contexto diferente y por lo cual sql server creara
un nuevo plan de ejecucion.

Aca te paso un script de como hacer para refrezcar las vistas, puedes usar
el mismo esquema para recompilar los sps, solo que debes usar la vista
INFORMATION_SCHEMA.ROUTINES y el sp sp_recompile.

use northwind
go

declare @sql nvarchar(4000)
declare @ts sysname
declare @tn sysname
declare views_cursor cursor
local
fast_forward
for
select
TABLE_SCHEMA,
TABLE_NAME
from
INFORMATION_SCHEMA.TABLES
where
TABLE_TYPE = 'VIEW'
and objectproperty(object_id(quotename(TABLE_SCHEMA) + '.' +
quotename(TABLE_NAME)), 'IsMSShipped') = 0

open views_cursor

while 1 = 1
begin
fetch next from views_cursor into @ts, @tn

if @@error != 0 or @@fetch_status != 0 break

set @sql = N'exec sp_refreshview ''' + quotename(@ts) + '.' +
quotename(@tn) + N''''

print @sql
exec sp_executesql @sql
end

close views_cursor
deallocate views_cursor
go

Tambien te paso un link para que leas sobre el tema de "parameter sniffing"
y por que esto influye en la ejecucion de un sp.

A technique for ensuring plan stability in SQL Server 2000
http://blogs.msdn.com/khen1234/arch...24228.aspx


AMB

"Sans" wrote:

> Recientemente tuve un problema con una aplicacion, la cual se quedaba
> congelada al ejecutar un sp que hace referencia a una vista...
> La solucion que le di fue re-crear la vista y a partir de ahi todo
> bien...
> He leido que en ocasiones hay que re-crear o recompilar vistas y
> spses esto cierto???
> Si es asi, que opciones tengo para hacerlo de manera automatica???
>
> Saludos
>
>
Respuesta Responder a este mensaje
#3 Sans
28/11/2005 - 17:49 | Informe spam
Una disculpa, no era mi intencion postear multiples veces la pregunta,
lo que paso es que al postear la pregunta me daba un error el servidor
de google, el cual me indicaba que lo intentara mas tarde, esa fue la
razon por la que lo intente en diferente horario y cual fue mi sorpresa
al ver hoy varias veces publicada mi pregunta...

Por otro lado agradezco mucho sus respuestas(Tuya y de Maxi), ya que me
dan una luz acerca de lo que debo hacer para evitar que vuelva a
suceder...

Saludos

Alejandro Mesa wrote:
Sans,

Me falto decir que es suficiente con postear una pregunta o problema una
sola vez. Postearla multiples veces, no solo hace mas dificil seguir el hilo,
sino que haces que otros miembros mal gasten su tiempo contestando preguntas
ya contestadas por otros miembros. No pienses solo en ti, recuerda que somos
un grupo.


Alejandro Mesa

"Alejandro Mesa" wrote:

> Sans,
>
> Cuando alteras una tabla que es referenciada desde una vista, sql server no
> actualiza la metadata de esa vista, tienes que refrescarla usando el
> procedimiento sp_refreshview. En cuanto a los procedimientos almacenados,
> estos deben ser recompilados si estos tienen parametros de entrada que seran
> usados en la clausula "where" de alguna sentencia "select" y los valores
> pasados no son tipicos ó el plan de ejecucion en el cache esta basado en
> valores no tipicos y se pasan valores tipicos (esto se conoce como "parameter
> sniffing") lo cual provoca que sql server use un plan de ejecucion no
> adecuado y para lo cual se recomiendo que se recompile el sp, lo cual se
> puede hacer usando sp_recompile, o la opcion "with recompile" cuando lo creas
> o cuando lo ejecutas. Tambien puedes usar sp_executesql para que la sentencia
> "select" se ejecute en un contexto diferente y por lo cual sql server creara
> un nuevo plan de ejecucion.
>
> Aca te paso un script de como hacer para refrezcar las vistas, puedes usar
> el mismo esquema para recompilar los sps, solo que debes usar la vista
> INFORMATION_SCHEMA.ROUTINES y el sp sp_recompile.
>
> use northwind
> go
>
> declare @sql nvarchar(4000)
> declare @ts sysname
> declare @tn sysname
> declare views_cursor cursor
> local
> fast_forward
> for
> select
> TABLE_SCHEMA,
> TABLE_NAME
> from
> INFORMATION_SCHEMA.TABLES
> where
> TABLE_TYPE = 'VIEW'
> and objectproperty(object_id(quotename(TABLE_SCHEMA) + '.' +
> quotename(TABLE_NAME)), 'IsMSShipped') = 0
>
> open views_cursor
>
> while 1 = 1
> begin
> fetch next from views_cursor into @ts, @tn
>
> if @@error != 0 or @@fetch_status != 0 break
>
> set @sql = N'exec sp_refreshview ''' + quotename(@ts) + '.' +
> quotename(@tn) + N''''
>
> print @sql
> exec sp_executesql @sql
> end
>
> close views_cursor
> deallocate views_cursor
> go
>
> Tambien te paso un link para que leas sobre el tema de "parameter sniffing"
> y por que esto influye en la ejecucion de un sp.
>
> A technique for ensuring plan stability in SQL Server 2000
> http://blogs.msdn.com/khen1234/arch...24228.aspx
>
>
> AMB
>
> "Sans" wrote:
>
> > Recientemente tuve un problema con una aplicacion, la cual se quedaba
> > congelada al ejecutar un sp que hace referencia a una vista...
> > La solucion que le di fue re-crear la vista y a partir de ahi todo
> > bien...
> > He leido que en ocasiones hay que re-crear o recompilar vistas y
> > spses esto cierto???
> > Si es asi, que opciones tengo para hacerlo de manera automatica???
> >
> > Saludos
> >
> >
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida