SQL, Mantenimiento a Base de datos
Script para crear un SP llamado xOptimiza
-- Create Proc xOptimiza @mov int AS -- Declaración de variables necesarias para los procesos DECLARE @ID int, @Name varChar(128), @Reindexa int, @Indice varchar(128), @DB VarChar(128) -- Select db_name() -- Asigana un valor correcto a esta variable para iniciar el proceso deseado Select @Reindexa = @mov, @DB = db_name() If @Reindexa < 5 Begin -- Se obtiene la lista de las tablas de usuario para despues poderlas analizar Declare Tablas Cursor For Select id, rTrim(name) from sysobjects where xtype = 'U' Order by name -- Abre el cursor "TABLAS" para recorrer tabla por tabla Open Tablas -- Obtiene el primer registro de las tablas Fetch Next From Tablas Into @ID, @Name While @@Fetch_Status = 0 Begin Print '******************************************************************* ' + @Name IF @Reindexa = 0 -- Muestra la Fragmentacion de la información e indices Dbcc Showcontig (@ID) IF @Reindexa = 1 Begin -- Defragmenta los indices de una tabla If Exists (Select Name From sysindexes Where Id = @ID and IndId <> 0) Begin Declare Indices Cursor For Select name From sysindexes Where id = @ID and indid <> 0 and rows <> 0 Open Indices Fetch Next From Indices Into @Indice While @@Fetch_Status = 0 Begin Print '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' + @Indice DBCC INDEXDEFRAG (@DB,@Name, @Indice) -- Select @Indice, @Name Fetch Next From Indices Into @Indice End Close Indices Deallocate Indices End Else print '-- No tiene indices que defragmentar' End IF @Reindexa = 2 Begin -- Muestra la fragmentación de la informacion e indices, y despues -- reconstrulle los indices de la tabla cambiandoles el fill-factor a 60 para un mejor desempeño If Exists (Select name From sysindexes Where id = @ID and indid <> 0) Begin Dbcc Showcontig (@ID) Declare Indices Cursor For Select name From sysindexes Where id = @ID and indid <> 0 and rows <> 0 Open Indices Fetch Next From Indices Into @Indice While @@Fetch_Status = 0 Begin Print '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' + @Indice DBCC DBREINDEX (@Name, @Indice, 80) -- Select @Indice, @Name Fetch Next From Indices Into @Indice End Close Indices Deallocate Indices End Else print '-- No tiene indices que defragmentar' End IF @Reindexa = 3 -- Revisa la integridad de la información, indices y la imagen de la página DBCC CheckTable (@Name) IF @Reindexa = 4 -- Informa el espacio utilizado por las tablas EXEC sp_spaceused @Name Print '' Print '' -- Obtiene siguiente registro de tablas Fetch Next From Tablas Into @ID, @Name End -- Cierra y libera el cursor "TABLAS" Close Tablas Deallocate Tablas End IF @Reindexa = 5 -- Revisa la consistenacia de el almacenamiento de la informacion en el -- disco duro DBCC CHECKALLOC (@DB) IF @Reindexa = 6 DBCC CHECKALLOC (@DB, REPAIR_REBUILD) -- Reactiva la opcion para contar los registros --Set NoCount OFF --
Los posibles valores que pude tomar la variable @Reindexa:
0 : Muestra la Fragmentación de la información e indices
1 : De fragmenta los indices de las tablas
2 : Muestra la fragmentación de la información e indices, y después reconstruye los indices de las tablas cambiándoles el fill-factor a 80 para un mejor desempeño
3 : Revisa la integridad de la información, indices y la imagen de la página
4 : Informa el espacio utilizado por las tablas
5 : Revisa la consistencia de el almacenamiento de la información en el disco duro
Modo para ejecutar el SP
-- Exec xOptimiza 1 --
Documento Confidencial