Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Problema con ALTER INDEX ... REORGANIZE Y REBUILD

Estas en el tema de Problema con ALTER INDEX ... REORGANIZE Y REBUILD en el foro de SQL Server en Foros del Web. Hola chic@s, tengo un problema con un procedimiento de mantenimiento de BD que quiero hacer: Lo que quiero conseguir es que el procedimiento recorra una ...
  #1 (permalink)  
Antiguo 18/02/2008, 06:58
 
Fecha de Ingreso: febrero-2008
Mensajes: 11
Antigüedad: 16 años, 3 meses
Puntos: 0
Problema con ALTER INDEX ... REORGANIZE Y REBUILD

Hola chic@s, tengo un problema con un procedimiento de mantenimiento de BD que quiero hacer:

Lo que quiero conseguir es que el procedimiento recorra una BD y, dependiendo el número de fragmentación que tenga cada índice, lo reorganice o lo reconstruya, teniendo en cuenta también que la tabla tiene que ser de tipo 'BASE TABLE'

Aquí les dejo lo que tengo hecho hasta ahora, que parece estar bien pero no me ejecuta el alter index, si alguien sabe donde esta el fallo o sabe cómo hacer este procedimiento por favor, que me ayude.

*-------------------------------------------------*--------------------------------------------------*
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
use T2O_PPP_Stats_PROD
go

DECLARE @Funciona int /*Variable para controlar si la transacción funciona o no*/
DECLARE @fragmentacion decimal /*Variable que contendrá la cantidad de fragmentación de los índices*/
DECLARE @nombretabla sysname, @indice sysname /*VariableS que contendráN el nombre de la tabla y del indice*/

/*Declaramos una variable CURSOR que contenga todos los nombres de las tablas, los indices, con su fragmentacion, de la BD*/

DECLARE desfragmenta CURSOR FOR
SELECT OBJECT_NAME(dt.object_id),si.name, dt.avg_fragmentation_in_percent
FROM
(SELECT object_id, index_id, avg_fragmentation_in_percent, avg_page_space_used_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(''), NULL, NULL, NULL, 'DETAILED')
WHERE index_id <> 0) as dt /*Con index_id <> 0 evitamos traer información de tablas que no tienen índices (Heaps)*/
INNER JOIN sys.indexes si
ON si.object_id = dt.object_id
AND si.index_id = dt.index_id
INNER JOIN INFORMATION_SCHEMA.TABLES
ON OBJECT_NAME(dt.object_id)=TABLE_NAME where table_type='BASE TABLE'

open desfragmenta /*Abrimos el cursor*/

BEGIN TRANSACTION Reorganizar /*Comenzamos una transaccion, llamada Reorganiza, como medida de seguridad.
Es opcional*/

BEGIN TRY

set @Funciona=0 /*Inicializamos Funciona a 0*/

fetch next from desfragmenta into @nombretabla, @indice, @fragmentacion /*Cogemos el 1ºvalor del cursor y
lo metemos en las variables que corresponden*/
while @@FETCH_STATUS=0 /*Mientras el estado del cursor sea 0, no haya llegado al fin*/

BEGIN
BEGIN TRY
IF (@fragmentacion>1)
BEGIN
IF (@fragmentacion<=33)
BEGIN
print 'Se reorganizará el Índice: ' + @indice + ', en la Tabla: ' + @nombretabla
EXEC ('ALTER INDEX ' + @indice + ' ON ' + @nombretabla + ' REORGANIZE')
print 'Se ha reorganizado la tabla ' + @nombretabla + '; Fragmentacion:'
print @Fragmentacion
END
ELSE
BEGIN
print 'Se recontruirá el Índice: ' + @indice + ', en la Tabla: ' + @nombretabla
EXEC ('ALTER INDEX ' + @indice + ' ON ' + @nombretabla + ' REBUILD');
print 'Se ha reconstruido la tabla ' + @nombretabla + '; Fragmentacion:'
print @Fragmentacion
END
END
END TRY

BEGIN CATCH /*Si falla algo en el TRY entra en el CATCH, sino sigue de largo*/
set @Funciona=1
print 'Error en la tabla '+@nombretabla + ' en la condición IF'
END CATCH
print @nombretabla
fetch next from desfragmenta into @nombretabla, @indice, @fragmentacion /*Le damos el siguiente valor del
cursor a nombretabla*/
END

END TRY

BEGIN CATCH /*Si falla algo en el TRY entra en el CATCH, sino sigue de largo*/
set @Funciona=1
print 'Error en el bucle'
END CATCH

print 'Funciona contiene el valor '
print @Funciona
if @Funciona=1
BEGIN
ROLLBACK TRANSACTION Reorganizar /*Dejamos la BD como estaba al principio*/
print 'No se ha modificado ningún dato de la BD'
END

else
BEGIN
COMMIT TRANSACTION Reorganizar /*Actualizamos la BD con los cambios realizados*/
print 'Se han modificado todos los datos de la tabla'
END

close desfragmenta /*Cerramos el cursor*/
deallocate desfragmenta

*-------------------------------------------------*--------------------------------------------------*


Saludos
  #2 (permalink)  
Antiguo 18/02/2008, 15:38
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Problema con ALTER INDEX ... REORGANIZE Y REBUILD

¿Quieres crear un PLAN DE MANTENIMIENTO de forma manual?, ¿No te sirve el que te proporciona SQL Server?.

Creo que si vas a regenar indices, bastaria con un simple DBCC DBREINDEX
  #3 (permalink)  
Antiguo 19/02/2008, 04:47
 
Fecha de Ingreso: febrero-2008
Mensajes: 3
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Problema con ALTER INDEX ... REORGANIZE Y REBUILD

Cita:
Iniciado por iislas Ver Mensaje
¿Quieres crear un PLAN DE MANTENIMIENTO de forma manual?, ¿No te sirve el que te proporciona SQL Server?.

Creo que si vas a regenar indices, bastaria con un simple DBCC DBREINDEX
el DBCC esta deprecated en sql 2005
  #4 (permalink)  
Antiguo 19/02/2008, 14:24
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Problema con ALTER INDEX ... REORGANIZE Y REBUILD

De acuerdo, aunque aun se menciona en la documentacion de SQL Server 2005, existe una nota que sera eliminado en versiones futuras y habla del ALTER INDEX, pero tambien hay toda una documentacion de como DESAROLLAR UN PLAN DE MANTENIMIENTO:

Para crear un plan de mantenimiento con el Asistente para planes de mantenimiento
En el Explorador de objetos, expanda un servidor y, a continuación, expanda Administración.

Haga clic con el botón secundario en Planes de mantenimiento y seleccione Asistente para planes de mantenimiento.

Siga los pasos del asistente para crear un plan de mantenimiento.
  #5 (permalink)  
Antiguo 19/02/2008, 16:36
 
Fecha de Ingreso: febrero-2008
Mensajes: 11
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Problema con ALTER INDEX ... REORGANIZE Y REBUILD

Bueno, al fin he dado con el problema, simplemente habia que poner with online=off. Muchas gracias iislas por tu ayuda.

Un saludo
  #6 (permalink)  
Antiguo 23/10/2008, 11:11
 
Fecha de Ingreso: abril-2008
Mensajes: 7
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Problema con ALTER INDEX ... REORGANIZE Y REBUILD

Hola Uruviel. Yo estoy trabajando exactamente en un plan de mantenimiento como el tuyo y me llamo la atencion.
Pregunta: En donde es que le pusiste el parametro del ONLINE=OFF que te solucionó el problema.

SAludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:22.