Twitter Facebook RSS Feed

jueves, 13 de marzo de 2014 a las 21:48hs por Gustavo Cantero (The Wolf)

Muchas veces nos a pasado que necesitamos reindexar todas las tablas de una base de datos del SQL Server y no encontramos un comando que lo haga. ¿A Uds. les pasó?
Bueno, para no entrar en pánico, especialmente si la base de datos tiene muchas tablas, armamos un script que obtiene sus nombres del diccionario de datos y ejecuta el comando DBCC REINDEX de SQL Server por cada una de ellas:

DECLARE @TableName varchar(200)
DECLARE TableCursor CURSOR FOR
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
     BEGIN
     
     PRINT 'Reindexando ' + @TableName
     DBCC DBREINDEX (@TableName)

     FETCH NEXT FROM TableCursor INTO @TableName
     END

CLOSE TableCursor
DEALLOCATE TableCursor

Es algo sencillo pero que nos puede ayudar a hacer un trabajo tedioso.
Espero les sirva.
Suerte!

29 comentarios »

  1. Alberto Rabellino dice:

    Esto es muy bueno. Nos hubiera ahorrado trabajo hace tiempo atrás!
    Abrazo

  2. Elias Gonzalez dice:

    Muchas gracias. Muy útil el cursor!

  3. Zoro dice:

    Muchisimas gracias… me salvaste XD me sirvió de maravilla y se mejoro el rendimiento de la base de datos.

  4. milton dice:

    Muchas gracias, que gran ayuda.

  5. Mario Roberto dice:

    Excelente!! De verdad muy util. Muchas gracias.

  6. AUC dice:

    buenazo me sirvio muchas gracias

  7. Te comento que fue realmente de mucha utilidad. Lo menos que puedo hacer es dejarte el comentario.

    Gracias

  8. Victor Sarabia dice:

    WOW Muchas gracias por compartir esta excelente, saludos!

  9. Plutarco Pérez dice:

    Gracias por compartir, justo lo que estaba buscando para no estar revisando porcentajes ni nada por el estilo.

  10. Djylka dice:

    Hola! Me podrías orientar en cómo se ejecuta esto? Directamente? Hay que cambiar algo? Gracias!

  11. Victor Rubilar C. dice:

    Muy bueno el código, pero quisiera agregarle algo mas que también puede ser de utilidad para ambientes donde se ocupe un esquema distinto al dbo

    Entonces para ello, cambiar la parte:

    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE'

    por:

    SELECT '[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']' FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE'

    Gracias y Bendiciones!!

  12. Dario dice:

    Excelente aporte! gracias por compartir conocimiento

  13. Lucas dice:

    Muchas Gracias fue muy util para una base de 60 Giga y 1900 tablas.. Tambien para nuevas version se podria utilizar segun estuve leyendo en documentacion de la pagina de SQL

    ALTER INDEX ALL @TableName ON REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON)

  14. Fran Martin dice:

    A mi me gusta esto que os dejo porque consulta la fragmentación de cada tabla y en función de eso, construyes la sentencia de REORGANIZE o de REBUILD:

    ---Ver fragmentation y construir las instrucciones
    
    WITH INDICES (BD, INDICETIPO, FRAGMENTACION, INDICE, TABLA)
    
    AS (
    SELECT DBS.NAME BASEDEDATOS, PS.INDEX_TYPE_DESC, PS.AVG_FRAGMENTATION_IN_PERCENT,
    IND.NAME INDICE, TAB.NAME TABLA
    FROM
    SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(), NULL, NULL, NULL, NULL) PS
    INNER JOIN SYS.DATABASES DBS
    ON PS.DATABASE_ID = DBS.DATABASE_ID
    INNER JOIN SYS.INDEXES IND
    ON PS.OBJECT_ID = IND.OBJECT_ID
    INNER JOIN SYS.TABLES TAB
    ON TAB.OBJECT_ID = IND.OBJECT_ID
    WHERE IND.NAME IS NOT NULL AND PS.INDEX_ID = IND.INDEX_ID
    AND PS.AVG_FRAGMENTATION_IN_PERCENT > 0)
    SELECT DISTINCT 
          CASE
          WHEN FRAGMENTACION > 5 AND FRAGMENTACION  30 THEN 'ALTER INDEX ' + INDICE + ' ON ' + TABLA + ' REBUILD WITH (ONLINE = ON)'
          END QUERY, FRAGMENTACION, BD, INDICE, TABLA
    FROM (SELECT FRAGMENTACION, INDICE, TABLA, BD FROM INDICES
          WHERE FRAGMENTACION > 5) A
    ORDER BY FRAGMENTACION DESC
  15. Cesar Cuadrado dice:

    Excelente, muy buena utilidad, me ahorra tiempo en el proceso . Muchas gracias y bendiciones

  16. Juanjo dice:

    Gracias

  17. Carlos Ortiz dice:

    Que diferencia existe en reconstruir indices de una base y reindexar toda la base?

  18. GUSTAVO QUIROS dice:

    Hola Gustavo, realmente excelente la solucion para reidexar.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.