Массовое обновление индексов в БД

DECLARE @SQL NVARCHAR(max)
DECLARE cur CURSOR local read_only forward_only FOR
  SELECT '     ALTER INDEX [' + i.NAME + N'] ON ['
         + Schema_name(o.[schema_id]) + '].[' + o.NAME
         + '] ' + CASE WHEN s.avg_fragmentation_in_percent > 30 THEN
         'REBUILD WITH (SORT_IN_TEMPDB = ON'
         -- Enterprise, Developer
         + CASE WHEN Serverproperty('EditionID') IN (1804890536, -2117995310)
         THEN
         ', ONLINE = ON' ELSE '' END + ')' ELSE 'REORGANIZE' END + ';'
  FROM   (SELECT s.[object_id],
                 s.index_id,
                 avg_fragmentation_in_percent =
                 Max(s.avg_fragmentation_in_percent)
          FROM   sys.Dm_db_index_physical_stats(Db_id(), NULL, NULL, NULL,
                 'DETAILED') s
          WHERE  s.page_count > 128 -- > 1 MB
                 AND s.index_id > 0 -- <> HEAP
                 AND s.avg_fragmentation_in_percent > 5
          GROUP  BY s.[object_id],
                    s.index_id) s
         JOIN sys.indexes i WITH(nolock)
           ON s.[object_id] = i.[object_id]
              AND s.index_id = i.index_id
         JOIN sys.objects o WITH(nolock)
           ON o.[object_id] = s.[object_id]

OPEN cur

FETCH next FROM cur INTO @SQL

WHILE @@FETCH_STATUS = 0
  BEGIN
      PRINT @SQL

      EXEC sys.Sp_executesql
        @SQL

      FETCH next FROM cur INTO @SQL
  END

CLOSE cur

DEALLOCATE cur 

Комментарии закрыты