lunes, 11 de mayo de 2009

Script para reorganizar todos los índices de una base de datos Sql Server

Sql Server nos proporciona un comando que nos permite reorganizar un índice de una tabla (reindexar). Este comando es DBCC DBREINDEX donde le debemos especificar el nombre de la tabla, el nombre del índice y el factor de relleno. Por ejemplo:

DBCC DBREINDEX ('pubs.dbo.authors', UPKCL_auidind, 80)

En este ejmplo le estamos indicando que queremos reorganizar el índice UPKCL_auidind de la tabla authors de la base de datos pubs. Reorganizar es un índice es una operación que hay que realizar de vez en cuando ya que, a medida que se va trabajando con una tabla, el índice se va fragmentando y por tanto, va perdiendo eficacia.

Pero ¿se pueden reorganizar todos los índices de todas las tablas de una base de datos? Recurriendo a un sencillo script Sql podemos hacerlo:
DECLARE @Tabla sysname
DECLARE contTabla CURSOR LOCAL FOR SELECT name FROM sysobjects WHERE OBJECTPROPERTY(id,N'IsUserTable') = 1
OPEN contTabla
FETCH NEXT FROM contTabla INTO @Tabla
WHILE @@FETCH_STATUS = 0
BEGIN
SET NOCOUNT ON
DBCC DBREINDEX(@Tabla,'',0) WITH NO_INFOMSGS
FETCH NEXT FROM contTabla INTO @Tabla
END
CLOSE contTabla
DEALLOCATE contTabla
Lo que hacemos es buscar todas las tablas que tenemos y reorganizar dentro de un bucle todos sus índices. Si al comando DBCC DBREINDEX no se le especifica el nombre del índice (se deja vacío), reorganiza todos los índices que tiene la tabla. Además, le añadimos la parte de WITH NO_INFOMSGS para que no muestre mensajes por pantalla.

1 comentario:

David dijo...

Hola, excelente script!. Muy buen post, lo estaba necesitando para realizar una reorganización de indices justamente. Una consulta, en ese script como podría especificar el uso de una db especifica?. Muchas Gracias!