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
 

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


Preguntas similares