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:

1DECLARE @TableName varchar(200)
2DECLARE TableCursor CURSOR FOR
3SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
4WHERE TABLE_TYPE = 'BASE TABLE'
5OPEN TableCursor
6FETCH NEXT FROM TableCursor INTO @TableName
7WHILE @@FETCH_STATUS = 0
8     BEGIN
9      
10     PRINT 'Reindexando ' + @TableName
11     DBCC DBREINDEX (@TableName)
12 
13     FETCH NEXT FROM TableCursor INTO @TableName
14     END
15 
16CLOSE TableCursor
17DEALLOCATE 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:

    1---Ver fragmentation y construir las instrucciones
    2 
    3WITH INDICES (BD, INDICETIPO, FRAGMENTACION, INDICE, TABLA)
    4 
    5AS (
    6SELECT DBS.NAME BASEDEDATOS, PS.INDEX_TYPE_DESC, PS.AVG_FRAGMENTATION_IN_PERCENT,
    7IND.NAME INDICE, TAB.NAME TABLA
    8FROM
    9SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(), NULL, NULL, NULL, NULL) PS
    10INNER JOIN SYS.DATABASES DBS
    11ON PS.DATABASE_ID = DBS.DATABASE_ID
    12INNER JOIN SYS.INDEXES IND
    13ON PS.OBJECT_ID = IND.OBJECT_ID
    14INNER JOIN SYS.TABLES TAB
    15ON TAB.OBJECT_ID = IND.OBJECT_ID
    16WHERE IND.NAME IS NOT NULL AND PS.INDEX_ID = IND.INDEX_ID
    17AND PS.AVG_FRAGMENTATION_IN_PERCENT > 0)
    18SELECT DISTINCT
    19      CASE
    20      WHEN FRAGMENTACION > 5 AND FRAGMENTACION  30 THEN 'ALTER INDEX ' + INDICE + ' ON ' + TABLA + ' REBUILD WITH (ONLINE = ON)'
    21      END QUERY, FRAGMENTACION, BD, INDICE, TABLA
    22FROM (SELECT FRAGMENTACION, INDICE, TABLA, BD FROM INDICES
    23      WHERE FRAGMENTACION > 5) A
    24ORDER 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.