指定したテーブルのインデックスを再編成(REORGANIZE)する方法 SQL Server


環境

SQL Server 2012

参考

前回の以下の投稿に若干手を加えて作成しました。
SQL Server の指定したテーブルのインデックス名を取得する方法

ストアドプロシージャを実装する

CREATE PROCEDURE [dbo].[sp_INDEX_REORGANIZE]
  @schema_name VARCHAR(MAX),
  @table_name VARCHAR(MAX)
AS
BEGIN
  DECLARE [cur_index_name] CURSOR FOR
  SELECT   I.name AS IndexName
  FROM     sys.objects AS O
               INNER JOIN sys.schemas AS S
                  ON O.schema_id = S.schema_id
               INNER JOIN sys.indexes AS I
                  ON O.object_id = I.object_id
  WHERE    S.NAME = @schema_name
           AND O.name = @table_name
           AND I.is_disabled = 0;

  OPEN [cur_index_name];

  DECLARE @index_name VARCHAR(MAX);
  DECLARE @sql VARCHAR(MAX);

  FETCH NEXT FROM [cur_index_name] INTO
    @index_name;

  WHILE (@@FETCH_STATUS = 0)
  BEGIN
    SET @sql = 'ALTER INDEX ' + @index_name + ' ON ' + @schema_name + N'.' + @table_name + ' REORGANIZE';
	PRINT @sql;
	EXECUTE (@sql);
    FETCH NEXT FROM [cur_index_name] INTO
      @index_name;
  END

  CLOSE [cur_index_name]
  DEALLOCATE [cur_index_name]
END

ストアドプロシージャを実行する

DECLARE @schema_name VARCHAR(MAX);
SET @schema_name = 'dbo';

DECLARE @table_name VARCHAR(MAX);
SET @table_name = 'ITEM';

EXECUTE sp_INDEX_REORGANIZE @schema_name, @table_name;