2011-03-07 16 views

Respuesta

1

Si ha vuelto a indexar correctamente sus tablas, la fragmentación del índice será cero (o cerca de si tiene tablas activas). Se puede utilizar esta secuencia de comandos para comprobar el nivel de fragmentación

DECLARE 
@IndexID int, 
@TableID int, 
@IndexName varchar(256) 

--Enter index name here 
SELECT @IndexName = '<index name>' 
--Enter table name here 
SET @TableID = OBJECT_ID('<table name>') 

SELECT @IndexID = IndID 
FROM sysindexes 
WHERE 
    id = @TableID 
    AND name = @IndexName 

DBCC SHOWCONTIG (@id, @IndexID) 

Lo que está buscando en la salida es la propiedad llamada densidad de digitalización. Esto debería estar cerca del 100%. Si no es así, entonces su re-indexación no se ha completado/exitosa


Si usted tiene un montón de tablas/índices, esto puede resultar tedioso, por lo que un corto circuito que por auto-generar el guión de esta manera:

SELECT 'DBCC SHOWCONTIG ' + 
    '(' 
     + CONVERT(varchar(32), si.id) + ',' 
     + CONVERT(varchar(32), si.indid) + 
    ')--' + so.name 
FROM sysobjects so 
INNER JOIN sysindexes si 
ON (so.id = si.id) 
WHERE (
    so.type = 'U' AND 
    si.indid < 2 AND 
    si.id = object_id(so.name) 
    ) 
+0

Gracias Seth.Tengo 100 tablas en DB y no sé el nombre del índice para cada una de las tablas. Así que cualquier otra forma de hacerlo – Pradeep

+0

Agregué un script de autogen que debería darle el mismo script que el anterior para cada tabla e índice. – Seth

+1

Alias ​​de tabla corregidos. Y agregué el 'so.name' al final como un comentario, me ayudó a localizar rápidamente a qué objeto se refiere. Podría lanzar un 'ORDER BY so.name' y la lista se ordenará por el nombre de los objetos. Guión útil de hecho. – Yaroslav

7

Si busca detalles sobre todos los índices y tablas de su base de datos, puede usarlos.

SELECT OBJECT_NAME(object_id),* 
FROM sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'SAMPLED') 

Se me acaba de ocurrir que también podría estar preguntando cómo saber el progreso de la reindexación. Para ello se puede utilizar

SELECT percent_complete 
from sys.dm_exec_requests 
where session_id= <spid of interest> 
+0

Tengo un trabajo de reconstrucción de índice ejecutado durante 12 horas. La ejecución de la consulta de porcentaje completado y el resultado devuelto fue 0. LOL. – MaDDoG

+0

@MaDDoG - En realidad, al mirar los documentos parece que esta columna solo está poblada para 'ALTER INDEX REORGANIZE'. Los documentos también solían decir que 'CREATE INDEX' actualizó esta columna, pero parece que [esa afirmación ya se eliminó] (https://connect.microsoft.com/SQLServer/feedback/details/641790/doc-sys- dm-exec-requests-topic-is-inconsistent-between-versions) –

1

Un punto clave sería la de ejecutar el informe "Índice de Estadística físicas" y "Uso del disco por Top Tablas", informa antes y después de reconstruir los índices.

En el informe "Estadísticas físicas del índice", puede ver qué tan fragmentado es cada índice.

Para ver estos informes ... * Haga clic con el botón derecho en la base de datos en Sql Server Management Studio * Pase el mouse sobre "Informes", luego "Informes estándar", luego seleccione el informe que desee.

Para un script puede configurar para identificar índices fragmentados y reconstruir ellos (y para más información), mira esto:

http://www.foliotek.com/devblog/sql-server-optimization-with-index-rebuilding/

0

Usted puede intentar este procedimiento. Se reconstruirá el índice de todas las tablas en la base de datos e imprimir el resultado a medida que avanza el panel de mensajes del Estudio de Gestión:

CREATE PROCEDURE [dbo].[ReIndexDatabase] 
AS 
DECLARE @MyTable VARCHAR(255) 
DECLARE myCursor 

CURSOR FOR 
SELECT table_name 
FROM information_schema.tables 
WHERE table_type = 'base table' 

OPEN myCursor 
FETCH NEXT 
FROM myCursor INTO @MyTable 

WHILE @@FETCH_STATUS = 0 BEGIN 
    PRINT 'Reindexing Table: ' + @MyTable 
    EXEC('ALTER INDEX ALL ON '[email protected]+' 
    REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = OFF, 
       STATISTICS_NORECOMPUTE = ON)'); 

    FETCH NEXT FROM myCursor INTO @MyTable 
END 

CLOSE myCursor 
DEALLOCATE myCursor 
EXEC sp_updatestats 

se puede ver este link para más información sobre la indexación de nuevo o este link.

Nota la información en la parte superior de la página.

Cuestiones relacionadas