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

Desfragmentar todas las BDs

Estas en el tema de Desfragmentar todas las BDs en el foro de SQL Server en Foros del Web. Hola... Supongo que conocereis el famoso script de ejemplo en la ayuda para Desfragmentar los Indices de todas las tablas de una BD. http://technet.microsoft.com/es-es/l.../ms175008.aspx La ...
  #1 (permalink)  
Antiguo 19/06/2012, 15:16
Avatar de Missi  
Fecha de Ingreso: agosto-2011
Mensajes: 391
Antigüedad: 12 años, 8 meses
Puntos: 43
Desfragmentar todas las BDs

Hola...

Supongo que conocereis el famoso script de ejemplo en la ayuda para Desfragmentar los Indices de todas las tablas de una BD.

http://technet.microsoft.com/es-es/l.../ms175008.aspx

La cuestión es ... como se podría hacer para que los haga para todas las BDs de un servidor.

Estoy intentándolo crear con un cursor y hacer algo parecido pero no llego a conseguirlo ya que no me hace el 'use' de las Bases de Datos correctamente...

Código:
DECLARE curDB CURSOR FORWARD_ONLY STATIC FOR  
   SELECT [name]  
   FROM master..sysdatabases 
   WHERE [name] NOT IN ('model', 'tempdb') 
   ORDER BY [name]
Dentro del cursor ejecutaría el famoso script

Código:
/*Perform a 'USE <database name>' to select the database in which to run the script.*/
-- Declare variables
SET NOCOUNT ON;
DECLARE @tablename varchar(255);
DECLARE @execstr   varchar(400);
DECLARE @objectid  int;
DECLARE @indexid   int;
DECLARE @frag      decimal;
DECLARE @maxfrag   decimal;

-- Decide on the maximum fragmentation to allow for.
SELECT @maxfrag = 30.0;

-- Declare a cursor.
DECLARE tables CURSOR FOR
   SELECT TABLE_SCHEMA + '.' + TABLE_NAME
   FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_TYPE = 'BASE TABLE';

-- Create the table.
CREATE TABLE #fraglist (
   ObjectName char(255),
   ObjectId int,
   IndexName char(255),
   IndexId int,
   Lvl int,
   CountPages int,
   CountRows int,
   MinRecSize int,
   MaxRecSize int,
   AvgRecSize int,
   ForRecCount int,
   Extents int,
   ExtentSwitches int,
   AvgFreeBytes int,
   AvgPageDensity int,
   ScanDensity decimal,
   BestCount int,
   ActualCount int,
   LogicalFrag decimal,
   ExtentFrag decimal);

-- Open the cursor.
OPEN tables;

-- Loop through all the tables in the database.
FETCH NEXT
   FROM tables
   INTO @tablename;

WHILE @@FETCH_STATUS = 0
BEGIN
-- Do the showcontig of all indexes of the table
   INSERT INTO #fraglist 
   EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''') 
      WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS');
   FETCH NEXT
      FROM tables
      INTO @tablename;
END;

-- Close and deallocate the cursor.
CLOSE tables;
DEALLOCATE tables;

-- Declare the cursor for the list of indexes to be defragged.
DECLARE indexes CURSOR FOR
   SELECT ObjectName, ObjectId, IndexId, LogicalFrag
   FROM #fraglist
   WHERE LogicalFrag >= @maxfrag
      AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;

-- Open the cursor.
OPEN indexes;

-- Loop through the indexes.
FETCH NEXT
   FROM indexes
   INTO @tablename, @objectid, @indexid, @frag;

WHILE @@FETCH_STATUS = 0
BEGIN
   PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',
      ' + RTRIM(@indexid) + ') - fragmentation currently '
       + RTRIM(CONVERT(varchar(15),@frag)) + '%';
   SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',
       ' + RTRIM(@indexid) + ')';
   EXEC (@execstr);

   FETCH NEXT
      FROM indexes
      INTO @tablename, @objectid, @indexid, @frag;
END;

-- Close and deallocate the cursor.
CLOSE indexes;
DEALLOCATE indexes;

-- Delete the temporary table.
DROP TABLE #fraglist;
GO
  #2 (permalink)  
Antiguo 19/06/2012, 15:26
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Desfragmentar todas las BDs

creo que no se puede meter un use dentro de un procedure o dentro de un query dinamico, tendrias que hacerlo como mencionan en esta liga:

http://stackoverflow.com/questions/1...-with-variable

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 19/06/2012, 15:30
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Desfragmentar todas las BDs

Intenta utilizar el store procedure no documentado:

EXEC sp_msforeachdb 'use [?];....................................

Ademas de que el ejemplo que muestras, esa para la version 2000, ¿de acuerdo?
__________________
MCTS Isaias Islas

Última edición por iislas; 19/06/2012 a las 15:35
  #4 (permalink)  
Antiguo 20/06/2012, 04:57
Avatar de Missi  
Fecha de Ingreso: agosto-2011
Mensajes: 391
Antigüedad: 12 años, 8 meses
Puntos: 43
Respuesta: Desfragmentar todas las BDs

Gracias por vuestras respuestas modificaré el script y os comento que tal.

El ejemplo es para sql2000, era consciente de ello.
  #5 (permalink)  
Antiguo 20/06/2012, 17:40
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Desfragmentar todas las BDs

Antes de codificar cualquier procedimiento, evalúa la posibilidad de crear un plan de mantenimiento que ya incluye la opción para desfragmentar los índices de una o todas las bases de datos.

Cita:
...Estoy intentándolo crear con un cursor y hacer algo parecido pero no llego a conseguirlo ya que no me hace el 'use' de las Bases de Datos correctamente...
Esto es un error muy común, el comando USE dentro de un SQL dinámico solo tiene ámbito durante la ejecución de ese SQL dinámico, es decir, si tienes la tabla T1 en la base DB1 y la tabla T2 en la base DB2, el comportamiento es:

Código:
--código con error, el contexto del segundo exec es DB1
use DB1
exec sp_executesql N'use DB2'
exec sp_executesql N'select * from T2'
go

--código correcto.
use DB1
exec sp_executesql N'use DB2 select * from T2'
go
Saludos
  #6 (permalink)  
Antiguo 20/06/2012, 20:46
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Desfragmentar todas las BDs

MATANGA

El problema al parecer, es que cuenta con la version 2000
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 22/06/2012, 16:03
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Desfragmentar todas las BDs

Cita:
Iniciado por iislas Ver Mensaje
MATANGA

El problema al parecer, es que cuenta con la version 2000
Me faltó más atención, respondí sin tener en cuenta la versión, de todos modos en este caso tuve suerte, en SQL Server 2000 ya existían los planes de mantenimiento para índices y también el sp_executesql.

Saludos
  #8 (permalink)  
Antiguo 22/06/2012, 16:58
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Desfragmentar todas las BDs

Sinceramente, no lo recuerdo, ya hace demasiado tiempo.....
__________________
MCTS Isaias Islas
  #9 (permalink)  
Antiguo 24/06/2012, 10:21
Avatar de Missi  
Fecha de Ingreso: agosto-2011
Mensajes: 391
Antigüedad: 12 años, 8 meses
Puntos: 43
Respuesta: Desfragmentar todas las BDs

Lo que buscaba es reorganizar o reconstruir dependiendo el nivel de fragmentación de los indices. (@maxfrag = 30.0)

SQL Server 2000 en los planes de mantenimiento no permite esa opción.

Con versiones posteriores a 2000 ya hace diferencia entre reorganizar y reconstruir indices pero no comprueba previamente el nivel de fragmentación para hacer una cosa u otra tal como te aconsejan en la misma ayuda de sqlserver (Books Online)

Etiquetas: desfragmentar, insert, select, tabla, todas
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 08:27.